File manager - Edit - /usr/local/CyberCP/plogical/virtualHostUtilities.py
Back
#!/usr/local/CyberCP/bin/python import os import os.path import sys import time import django # PACKAGE_PARENT = '..' # SCRIPT_DIR = os.path.dirname(os.path.realpath(os.path.join(os.getcwd(), os.path.expanduser(__file__)))) # sys.path.append(os.path.normpath(os.path.join(SCRIPT_DIR, PACKAGE_PARENT))) sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") from random import randint django.setup() import argparse from plogical import installUtilities from plogical import sslUtilities from multiprocessing import Process import subprocess import shlex from plogical.mailUtilities import mailUtilities from plogical import CyberCPLogFileWriter as logging from plogical.dnsUtilities import DNS from plogical.vhost import vhost from plogical.acl import ACLManager from plogical.processUtilities import ProcessUtilities from ApachController.ApacheController import ApacheController from ApachController.ApacheVhosts import ApacheVhost from managePHP.phpManager import PHPManager try: from websiteFunctions.models import Websites, ChildDomains, aliasDomains from loginSystem.models import Administrator from packages.models import Package from CLManager.models import CLPackages except: pass ## If you want justice, you have come to the wrong place. class virtualHostUtilities: apache = 1 ols = 2 lsws = 3 Server_root = "/usr/local/lsws" cyberPanel = "/usr/local/CyberCP" redisConf = '/usr/local/lsws/conf/dvhost_redis.conf' vhostConfPath = '/usr/local/lsws/conf' @staticmethod def OnBoardingHostName(Domain, tempStatusPath, skipRDNSCheck): import json import OpenSSL logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Setting up hostname,10') admin = Administrator.objects.get(pk=1) try: config = json.loads(admin.config) except: config = {} ### probably need to add temporary dns resolver nameserver here - pending try: CurrentHostName = config['hostname'] except: CurrentHostName = '' if skipRDNSCheck: pass else: if os.path.exists('/home/cyberpanel/postfix'): pass else: message = 'This server does not come with postfix installed. [404]' print(message) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) return 0 #### PostFixHostname = mailUtilities.FetchPostfixHostname() serverIP = ACLManager.fetchIP() ### if skipRDNSCheck == 1, it means we need to skip checking for rDNS if skipRDNSCheck: ### so if skipRDNSCheck is 1 means we need to skip checking for rDNS so lets set current as rDNS because no checking is required rDNS = [CurrentHostName] else: rDNS = mailUtilities.reverse_dns_lookup(serverIP) time.sleep(3) if os.path.exists(ProcessUtilities.debugPath): print(f'Postfix Hostname: {PostFixHostname}. Server IP {serverIP}. rDNS: {str(rDNS)}') logging.CyberCPLogFileWriter.writeToFile(f'Postfix Hostname: {PostFixHostname}. Server IP {serverIP}. rDNS: {str(rDNS)}, rDNS check {skipRDNSCheck}') ### Case 1 if hostname already exists check if same hostname in postfix and rdns filePath = '/etc/letsencrypt/live/%s/fullchain.pem' % (PostFixHostname) if (CurrentHostName == PostFixHostname and CurrentHostName in rDNS) and os.path.exists(filePath): # expireData = x509.get_notAfter().decode('ascii') # finalDate = datetime.strptime(expireData, '%Y%m%d%H%M%SZ') # now = datetime.now() # diff = finalDate - now message = 'Hostname is already set, the same hostname is also used with mail service and rDNS. Let see if valid SSL also exists for this hostname..,10' print(message) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open(filePath, 'r').read()) SSLProvider = x509.get_issuer().get_components()[1][1].decode('utf-8') try: child = ChildDomains.objects.get(domain=CurrentHostName) website = child.master path = child.path except: website = Websites.objects.get(domain=CurrentHostName) path = f'/home/{CurrentHostName}/public_html' if SSLProvider == 'Denial': message = 'It seems that the hostname used with mail service and rDNS does not have a valid SSL certificate, CyberPanel will try to issue valid SSL and restart related services,20' logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) virtualHostUtilities.issueSSL(CurrentHostName, path, website.adminEmail) ### once SSL is issued, re-read the SSL file and check if valid ssl got issued. x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open(filePath, 'r').read()) SSLProvider = x509.get_issuer().get_components()[1][1].decode('utf-8') if SSLProvider == 'Denial': message = 'Hostname SSL was already issued, and same hostname was used in mail server SSL, rDNS was also configured but we found invalid SSL. However, we tried to issue SSL and it failed. [404]' logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) config['hostname'] = Domain config['onboarding'] = 3 config['skipRDNSCheck'] = skipRDNSCheck admin.config = json.dumps(config) admin.save() return 0 else: message = "It looks like your current hostname is already the mail server hostname and rDNS is also set and there is a valid SSL, nothing needed to do." print(message) config['hostname'] = Domain config['onboarding'] = 1 config['skipRDNSCheck'] = skipRDNSCheck admin.config = json.dumps(config) admin.save() logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) command = 'postmap -F hash:/etc/postfix/vmail_ssl.map && systemctl restart postfix && systemctl restart dovecot' ProcessUtilities.executioner(command, 'root', True) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Completed. [200]') else: ### create site if not there try: website = Websites.objects.get(domain=Domain) except: try: child = ChildDomains.objects.get(domain=Domain) except: DataToPass = {} currentTemp = tempStatusPath DataToPass['domainName'] = Domain DataToPass['adminEmail'] = admin.email DataToPass['phpSelection'] = "PHP 8.0" DataToPass['websiteOwner'] = "admin" DataToPass['package'] = "Default" DataToPass['ssl'] = 1 DataToPass['dkimCheck'] = 1 DataToPass['openBasedir'] = 0 DataToPass['mailDomain'] = 0 DataToPass['apacheBackend'] = 0 UserID = admin.pk from websiteFunctions.website import WebsiteManager ab = WebsiteManager() coreResult = ab.submitWebsiteCreation(admin.id, DataToPass) coreResult1 = json.loads((coreResult).content) logging.CyberCPLogFileWriter.writeToFile("Creating website result....%s" % coreResult1) reutrntempath = coreResult1['tempStatusPath'] while (1): lastLine = open(reutrntempath, 'r').read() if os.path.exists(ProcessUtilities.debugPath): logging.CyberCPLogFileWriter.writeToFile("Info web creating lastline ....... %s" % lastLine) if lastLine.find('[200]') > -1: break elif lastLine.find('[404]') > -1: statusFile = open(currentTemp, 'w') statusFile.writelines('Failed to Create Website: error: %s. [404]' % lastLine) statusFile.close() return 0 else: statusFile = open(currentTemp, 'w') statusFile.writelines('Creating Website....,20') statusFile.close() time.sleep(2) ### Case 2 where postfix hostname either does not exist or does not match with server hostname or ### hostname does not exists at all ### if skipRDNSCheck == 1, it means we need to skip checking for rDNS if skipRDNSCheck: ### so if skipRDNSCheck is 1 means we need to skip checking for rDNS so lets set current domain as rDNS because no checking is required rDNS = [Domain] if os.path.exists(ProcessUtilities.debugPath): logging.CyberCPLogFileWriter.writeToFile( f'Second if: Postfix Hostname: {PostFixHostname}. Server IP {serverIP}. rDNS: {str(rDNS)}, rDNS check {skipRDNSCheck}') #first check if hostname is already configured as rDNS, if not return error if Domain not in rDNS: message = 'Domain that you have provided is not configured as rDNS for your server IP. [404]' print(message) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) config['hostname'] = Domain config['onboarding'] = 3 config['skipRDNSCheck'] = skipRDNSCheck admin.config = json.dumps(config) admin.save() return 0 ### now issue hostname ssl try: website = Websites.objects.get(domain=Domain) path = "/home/" + Domain + "/public_html" except: website = ChildDomains.objects.get(domain=Domain) path = website.path filePath = '/etc/letsencrypt/live/%s/fullchain.pem' % (Domain) virtualHostUtilities.issueSSLForHostName(Domain, path, 1) x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open(filePath, 'r').read()) SSLProvider = x509.get_issuer().get_components()[1][1].decode('utf-8') if SSLProvider == 'Denial': message = 'Failed to issue Hostname SSL, either its DNS record is not propagated or the domain is behind Cloudflare. If DNS is already propagated you might have reached Lets Encrypt limit, please wait before trying again.. [404]' logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) config['hostname'] = Domain config['onboarding'] = 3 config['skipRDNSCheck'] = skipRDNSCheck admin.config = json.dumps(config) admin.save() return 0 logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Hostname SSL issued,50') virtualHostUtilities.issueSSLForMailServer(Domain, path) x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, open(filePath, 'r').read()) SSLProvider = x509.get_issuer().get_components()[1][1].decode('utf-8') if SSLProvider == 'Denial': message = 'Failed to issue Mail server SSL, either its DNS record is not propagated or the domain is behind Cloudflare. [404]' logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, message) logging.CyberCPLogFileWriter.writeToFile(message) config['hostname'] = Domain config['onboarding'] = 3 config['skipRDNSCheck'] = skipRDNSCheck admin.config = json.dumps(config) admin.save() return 0 else: config['hostname'] = Domain config['onboarding'] = 1 config['skipRDNSCheck'] = skipRDNSCheck admin.config = json.dumps(config) admin.save() command = 'systemctl restart postfix && systemctl restart dovecot && postmap -F hash:/etc/postfix/vmail_ssl.map' ProcessUtilities.executioner(command, 'root', True) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Completed. [200]') @staticmethod def setupAutoDiscover(mailDomain, tempStatusPath, virtualHostName, admin): if mailDomain: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Creating mail child domain..,80') childDomain = 'mail.%s' % (virtualHostName) childPath = '/home/%s/%s' % (virtualHostName, childDomain) result = virtualHostUtilities.createDomain(virtualHostName, childDomain, 'PHP 7.3', childPath, 1, 0, 0, admin.userName, 0, "/home/cyberpanel/" + str(randint(1000, 9999))) if result[0] == 0: sslUtilities.issueSSLForDomain(childDomain, admin.email, childPath) ## update dovecot conf to enable auto-discover dovecotPath = '/etc/dovecot/dovecot.conf' if os.path.exists(dovecotPath): dovecotContent = open(dovecotPath, 'r').read() if dovecotContent.find('/live/%s/' % (childDomain)) == -1: content = """\nlocal_name %s { ssl_cert = </etc/letsencrypt/live/%s/fullchain.pem ssl_key = </etc/letsencrypt/live/%s/privkey.pem } local_name %s { ssl_cert = </etc/letsencrypt/live/%s/fullchain.pem ssl_key = </etc/letsencrypt/live/%s/privkey.pem } \n""" % (childDomain, childDomain, childDomain, virtualHostName, virtualHostName, virtualHostName) writeToFile = open(dovecotPath, 'a') writeToFile.write(content) writeToFile.close() command = 'systemctl restart dovecot' ProcessUtilities.executioner(command) ### Update postfix configurations postFixPath = '/etc/postfix/main.cf' postFixContent = open(postFixPath, 'r').read() if postFixContent.find('tls_server_sni_maps') == -1: writeToFile = open(postFixPath, 'a') writeToFile.write('\ntls_server_sni_maps = hash:/etc/postfix/vmail_ssl.map\n') writeToFile.close() postfixMapFile = '/etc/postfix/vmail_ssl.map' try: postfixMapFileContent = open(postfixMapFile, 'r').read() except: postfixMapFileContent = '' if postfixMapFileContent.find('/live/%s/' % (childDomain)) == -1: mapContent = f'%s /etc/letsencrypt/live/%s/privkey.pem /etc/letsencrypt/live/%s/fullchain.pem\n{virtualHostName} /etc/letsencrypt/live/{virtualHostName}/privkey.pem /etc/letsencrypt/live/{virtualHostName}/fullchain.pem\n' % ( childDomain, childDomain, childDomain) writeToFile = open(postfixMapFile, 'a') writeToFile.write(mapContent) writeToFile.close() command = 'postmap -F hash:/etc/postfix/vmail_ssl.map' ProcessUtilities.executioner(command) command = 'systemctl restart postfix' ProcessUtilities.executioner(command) ### even if mail domain creation is not set, we will have to set up auto discover for main domain dovecotPath = '/etc/dovecot/dovecot.conf' if os.path.exists(dovecotPath): dovecotContent = open(dovecotPath, 'r').read() if dovecotContent.find('/live/%s/' % (virtualHostName)) == -1: content = """ local_name %s { ssl_cert = </etc/letsencrypt/live/%s/fullchain.pem ssl_key = </etc/letsencrypt/live/%s/privkey.pem } """ % (virtualHostName, virtualHostName, virtualHostName) writeToFile = open(dovecotPath, 'a') writeToFile.write(content) writeToFile.close() command = 'systemctl restart dovecot' ProcessUtilities.executioner(command) ### Update postfix configurations postFixPath = '/etc/postfix/main.cf' postFixContent = open(postFixPath, 'r').read() if postFixContent.find('tls_server_sni_maps') == -1: writeToFile = open(postFixPath, 'a') writeToFile.write('\ntls_server_sni_maps = hash:/etc/postfix/vmail_ssl.map\n') writeToFile.close() postfixMapFile = '/etc/postfix/vmail_ssl.map' try: postfixMapFileContent = open(postfixMapFile, 'r').read() except: postfixMapFileContent = '' if postfixMapFileContent.find('/live/%s/' % (virtualHostName)) == -1: mapContent = f'{virtualHostName} /etc/letsencrypt/live/{virtualHostName}/privkey.pem /etc/letsencrypt/live/{virtualHostName}/fullchain.pem\n' writeToFile = open(postfixMapFile, 'a') writeToFile.write(mapContent) writeToFile.close() command = 'postmap -F hash:/etc/postfix/vmail_ssl.map' ProcessUtilities.executioner(command) command = 'systemctl restart postfix' ProcessUtilities.executioner(command) @staticmethod def createVirtualHost(virtualHostName, administratorEmail, phpVersion, virtualHostUser, ssl, dkimCheck, openBasedir, websiteOwner, packageName, apache, tempStatusPath='/home/cyberpanel/fakePath', mailDomain=None, LimitsCheck=1): try: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Running some checks..,0') ####### Limitations check admin = Administrator.objects.get(userName=websiteOwner) if LimitsCheck: if ACLManager.websitesLimitCheck(admin, 1) == 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'You\'ve reached maximum websites limit as a reseller. [404]') return 0, 'You\'ve reached maximum websites limit as a reseller.' ####### Limitations Check End if Websites.objects.filter(domain=virtualHostName).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This website already exists. [404]') return 0, "This website already exists." if Websites.objects.filter(domain=virtualHostName.lstrip('www.')).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This website already exists. [404]') return 0, "This website already exists." if ChildDomains.objects.filter(domain=virtualHostName).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This website already exists as child domain. [404]') return 0, "This website already exists as child domain." if ChildDomains.objects.filter(domain=virtualHostName.lstrip('www.')).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This website already exists as child domain. [404]') return 0, "This website already exists as child domain." ####### Limitations Check End logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Creating DNS records..,10') ##### Zone creation DNS.dnsTemplate(virtualHostName, admin) ## Zone creation logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Setting up directories..,25') if vhost.checkIfVirtualHostExists(virtualHostName) == 1: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Virtual Host Directory already exists. [404]') return 0, "Virtual Host Directory already exists!" if vhost.checkIfAliasExists(virtualHostName) == 1: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This domain exists as Alias. [404]') return 0, "This domain exists as Alias." postfixPath = '/home/cyberpanel/postfix' if os.path.exists(postfixPath): retValues = mailUtilities.setupDKIM(virtualHostName) if retValues[0] == 0: raise BaseException(retValues[1]) retValues = vhost.createDirectoryForVirtualHost(virtualHostName, administratorEmail, virtualHostUser, phpVersion, openBasedir) if retValues[0] == 0: raise BaseException(retValues[1]) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Creating configurations..,50') if not os.path.exists(virtualHostUtilities.redisConf): retValues = vhost.createConfigInMainVirtualHostFile(virtualHostName) if retValues[0] == 0: raise BaseException(retValues[1]) selectedPackage = Package.objects.get(packageName=packageName) if LimitsCheck: website = Websites(admin=admin, package=selectedPackage, domain=virtualHostName, adminEmail=administratorEmail, phpSelection=phpVersion, ssl=ssl, externalApp=virtualHostUser) website.save() if admin.defaultSite == 0: admin.defaultSite = website.id admin.save() if ssl == 1: sslPath = "/home/" + virtualHostName + "/public_html" logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Setting up SSL..,70') if not os.path.exists(virtualHostUtilities.redisConf): installUtilities.installUtilities.reStartLiteSpeed() retValues = sslUtilities.issueSSLForDomain(virtualHostName, administratorEmail, sslPath) if retValues[0] == 0: raise BaseException(retValues[1]) else: if not os.path.exists(virtualHostUtilities.redisConf): installUtilities.installUtilities.reStartLiteSpeed() logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'SSL set up done..,70') if ssl == 0: if not os.path.exists(virtualHostUtilities.redisConf): installUtilities.installUtilities.reStartLiteSpeed() vhost.finalizeVhostCreation(virtualHostName, virtualHostUser) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'vHost finalized..,70') ## Check If Apache is requested confPath = vhost.Server_root + "/conf/vhosts/" + virtualHostName completePathToConfigFile = confPath + "/vhost.conf" if apache: if ProcessUtilities.decideServer() == ProcessUtilities.OLS: if ApacheController.checkIfApacheInstalled() == 0: result = ApacheController.setupApache(tempStatusPath) if result[0] == 0: raise BaseException(result[1]) result = ApacheVhost.setupApacheVhost(administratorEmail, virtualHostUser, virtualHostUser, phpVersion, virtualHostName) if result[0] == 0: raise BaseException(result[1]) else: ApacheVhost.perHostVirtualConfOLS(completePathToConfigFile, administratorEmail) installUtilities.installUtilities.reStartLiteSpeed() php = PHPManager.getPHPString(phpVersion) phpService = ApacheVhost.DecideFPMServiceName(phpVersion) command = f"systemctl restart {phpService}" ProcessUtilities.normalExecutioner(command) ## Create Configurations ends here logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'DKIM Setup..,70') ## DKIM Check postFixPath = '/home/cyberpanel/postfix' if os.path.exists(postFixPath): if dkimCheck == 1: DNS.createDKIMRecords(virtualHostName) CLPath = '/etc/sysconfig/cloudlinux' if os.path.exists(CLPath): command = '/usr/share/cloudlinux/hooks/post_modify_user.py create --username %s --owner %s' % ( virtualHostUser, admin.userName) ProcessUtilities.executioner(command) ### For autodiscover of mail clients. virtualHostUtilities.setupAutoDiscover(mailDomain, tempStatusPath, virtualHostName, admin) ### spaceString = f'{selectedPackage.diskSpace}M {selectedPackage.diskSpace}M' if selectedPackage.enforceDiskLimits: command = f'setquota -u {virtualHostUser} {spaceString} 0 0 /' ProcessUtilities.executioner(command) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Website successfully created. [200]') return 1, 'None' except BaseException as msg: if ACLManager.FindIfChild() == 0: vhost.deleteVirtualHostConfigurations(virtualHostName) logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [createVirtualHost]") logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, str(msg) + " [404]") return 0, str(msg) @staticmethod def issueSSL(virtualHost, path, adminEmail): try: retValues = sslUtilities.issueSSLForDomain(virtualHost, adminEmail, path) if retValues[0] == 0: print("0," + str(retValues[1])) logging.CyberCPLogFileWriter.writeToFile(str(retValues[1])) return 0, str(retValues[1]) installUtilities.installUtilities.reStartLiteSpeed() command = 'systemctl restart postfix' ProcessUtilities.executioner(command) command = 'systemctl restart dovecot' ProcessUtilities.executioner(command) print("1,None") return 1, None except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [issueSSL]") print("0," + str(msg)) return 0, str(msg) @staticmethod def issueSSLv2(virtualHost, path, adminEmail): try: import plogical.sslv2 as sslv2 retValues = sslv2.issueSSLForDomain(virtualHost, adminEmail, path) if retValues[0] == 0: print("0," + str(retValues[1])) logging.CyberCPLogFileWriter.writeToFile(str(retValues[1])) return 0, str(retValues[1]) installUtilities.installUtilities.reStartLiteSpeed() command = 'systemctl restart postfix' ProcessUtilities.executioner(command) command = 'systemctl restart dovecot' ProcessUtilities.executioner(command) print(f"1,{str(retValues[1])}") return 1, str(retValues[1]) except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [issueSSL]") print("0," + str(msg)) return 0, str(msg) @staticmethod def getAccessLogs(fileName, page, externalApp): try: if os.path.islink(fileName): print("0, %s file is symlinked." % (fileName)) return 0 groupName = 'nobody' numberOfTotalLines = int( ProcessUtilities.outputExecutioner('wc -l %s' % (fileName), groupName).split(" ")[0]) if numberOfTotalLines < 25: data = ProcessUtilities.outputExecutioner('cat %s' % (fileName), groupName) else: if page == 1: end = numberOfTotalLines start = end - 24 if start <= 0: start = 1 startingAndEnding = "'" + str(start) + "," + str(end) + "p'" command = "sed -n " + startingAndEnding + " " + fileName data = ProcessUtilities.outputExecutioner(command, groupName) else: end = numberOfTotalLines - ((page - 1) * 25) start = end - 24 if start <= 0: start = 1 startingAndEnding = "'" + str(start) + "," + str(end) + "p'" command = "sed -n " + startingAndEnding + " " + fileName data = ProcessUtilities.outputExecutioner(command, groupName) print(data) return data except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [getAccessLogs]") print("1,None") return "1,None" @staticmethod def getErrorLogs(fileName, page, externalApp): try: if os.path.islink(fileName): print("0, %s file is symlinked." % (fileName)) return 0 numberOfTotalLines = int( ProcessUtilities.outputExecutioner('wc -l %s' % (fileName), externalApp).split(" ")[0]) if numberOfTotalLines < 25: data = ProcessUtilities.outputExecutioner('cat %s' % (fileName), externalApp) else: if page == 1: end = numberOfTotalLines start = end - 24 if start <= 0: start = 1 startingAndEnding = "'" + str(start) + "," + str(end) + "p'" command = "sed -n " + startingAndEnding + " " + fileName data = ProcessUtilities.outputExecutioner(command, externalApp) else: end = numberOfTotalLines - ((page - 1) * 25) start = end - 24 if start <= 0: start = 1 startingAndEnding = "'" + str(start) + "," + str(end) + "p'" command = "sed -n " + startingAndEnding + " " + fileName data = ProcessUtilities.outputExecutioner(command, externalApp) print(data) return data except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [getErrorLogs]") print("1,None") return "1,None" @staticmethod def saveVHostConfigs(fileName, tempPath): try: vhost = open(fileName, "w") vhost.write(open(tempPath, "r").read()) vhost.close() if os.path.exists(tempPath): os.remove(tempPath) installUtilities.installUtilities.reStartLiteSpeed() print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [saveVHostConfigs]") print("0," + str(msg)) @staticmethod def saveApacheConfigsToFile(fileName, tempPath): try: vhost = open(fileName, "w") vhost.write(open(tempPath, "r").read()) vhost.close() if os.path.exists(tempPath): os.remove(tempPath) command = f"systemctl restart {ApacheVhost.serviceName}" ProcessUtilities.normalExecutioner(command) print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [saveApacheConfigsToFile]") print("0," + str(msg)) @staticmethod def saveRewriteRules(virtualHost, fileName, tempPath): try: if os.path.islink(fileName): print("0, .htaccess file is symlinked.") return 0 vhost.addRewriteRules(virtualHost, fileName) vhostFile = open(fileName, "w") vhostFile.write(open(tempPath, "r").read()) vhostFile.close() try: if os.path.exists(tempPath): os.remove(tempPath) except: pass print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [saveRewriteRules]") print("0," + str(msg)) @staticmethod def issueSSLForHostName(virtualHost, path, skipLSCPDRestart=0): try: destPrivKey = "/usr/local/lscp/conf/key.pem" destCert = "/usr/local/lscp/conf/cert.pem" lswsAdminPrivKey = "/usr/local/lsws/admin/conf/cert/admin.key" lswsAdminCert = "/usr/local/lsws/admin/conf/cert/admin.crt" olsAdminPrivKey = "/usr/local/lsws/admin/conf/webadmin.key" olsAdminCert = "/usr/local/lsws/admin/conf/webadmin.crt" pathToStoreSSLFullChain = '/etc/letsencrypt/live/' + virtualHost + '/fullchain.pem' pathToStoreSSLPrivKey = '/etc/letsencrypt/live/' + virtualHost + '/privkey.pem' adminEmail = "email@" + virtualHost retValues = sslUtilities.issueSSLForDomain(virtualHost, adminEmail, path) if retValues[0] == 0: print("0," + str(retValues[1])) return 0, retValues[1] command = 'chmod 600 %s' % (destPrivKey) ProcessUtilities.normalExecutioner(command) ## removing old certs for lscpd if os.path.exists(destPrivKey): os.remove(destPrivKey) if os.path.exists(destCert): os.remove(destCert) ## removing self signed certs for lsws webadmin if os.path.exists(lswsAdminCert): os.remove(lswsAdminCert) if os.path.exists(lswsAdminPrivKey): os.remove(lswsAdminPrivKey) ## create symlink for hostname SSL for lsws webadmin SSL command = 'ln -s %s /usr/local/lsws/admin/conf/cert/admin.crt' % (pathToStoreSSLFullChain) ProcessUtilities.normalExecutioner(command) command = 'ln -s %s /usr/local/lsws/admin/conf/cert/admin.key' % (pathToStoreSSLPrivKey) ProcessUtilities.normalExecutioner(command) ## removing self signed certs for ols webadmin if os.path.exists(olsAdminCert): os.remove(olsAdminCert) if os.path.exists(olsAdminPrivKey): os.remove(olsAdminPrivKey) ## create symlink for hostname SSL for lsws webadmin SSL command = 'ln -s %s /usr/local/lsws/admin/conf/webadmin.crt' % (pathToStoreSSLFullChain) ProcessUtilities.normalExecutioner(command) command = 'ln -s %s /usr/local/lsws/admin/conf/webadmin.key' % (pathToStoreSSLPrivKey) ProcessUtilities.normalExecutioner(command) ## command = 'ln -s %s %s' % (pathToStoreSSLFullChain, destCert) ProcessUtilities.executioner(command) command = 'ln -s %s %s' % (pathToStoreSSLPrivKey, destPrivKey) ProcessUtilities.executioner(command) if skipLSCPDRestart: pass else: command = 'systemctl restart lscpd' cmd = shlex.split(command) subprocess.call(cmd) print("1,None") return 1, 'None' except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [issueSSLForHostName]") print("0," + str(msg)) return 0, str(msg) @staticmethod def issueSSLForMailServer(virtualHost, path): try: srcFullChain = '/etc/letsencrypt/live/' + virtualHost + '/fullchain.pem' srcPrivKey = '/etc/letsencrypt/live/' + virtualHost + '/privkey.pem' adminEmail = "email@" + virtualHost retValues = sslUtilities.issueSSLForDomain(virtualHost, adminEmail, path) if retValues[0] == 0: print("0," + str(retValues[1])) return 0, retValues[1] ## MailServer specific functions if os.path.exists("/etc/postfix/cert.pem"): os.remove("/etc/postfix/cert.pem") if os.path.exists("/etc/postfix/key.pem"): os.remove("/etc/postfix/key.pem") if os.path.exists("/etc/pki/dovecot/private/dovecot.pem"): os.remove("/etc/pki/dovecot/private/dovecot.pem") if os.path.exists("/etc/pki/dovecot/certs/dovecot.pem"): os.remove("/etc/pki/dovecot/certs/dovecot.pem") if os.path.exists("/etc/dovecot/key.pem"): os.remove("/etc/dovecot/key.pem") if os.path.exists("/etc/dovecot/cert.pem"): os.remove("/etc/dovecot/cert.pem") ## Postfix command = 'ln -s %s /etc/postfix/key.pem' % (srcPrivKey) ProcessUtilities.executioner(command) command = 'ln -s %s /etc/postfix/cert.pem' % (srcFullChain) ProcessUtilities.executioner(command) ## Dovecot command = 'ln -s %s /etc/pki/dovecot/private/dovecot.pem' % (srcPrivKey) ProcessUtilities.executioner(command) command = 'ln -s %s /etc/pki/dovecot/certs/dovecot.pem' % (srcFullChain) ProcessUtilities.executioner(command) ## Dovecot 2ND command = 'ln -s %s /etc/dovecot/key.pem' % (srcPrivKey) ProcessUtilities.executioner(command) command = 'ln -s %s /etc/dovecot/cert.pem' % (srcFullChain) ProcessUtilities.executioner(command) ## Update postmaster address dovecot filePath = "/etc/dovecot/dovecot.conf" data = open(filePath, 'r').readlines() writeFile = open(filePath, 'w') for items in data: if items.find('postmaster_address') > -1: writeFile.writelines(' postmaster_address = postmaster@' + virtualHost + '\n') else: writeFile.writelines(items) writeFile.close() ## Update myhostname address postfix filePath = "/etc/postfix/main.cf" data = open(filePath, 'r').readlines() writeFile = open(filePath, 'w') for items in data: if items.find('myhostname') > -1: writeFile.writelines('myhostname = ' + virtualHost + '\n') else: writeFile.writelines(items) writeFile.close() p = Process(target=mailUtilities.restartServices, args=()) p.start() print("1,None") return 1, 'None' except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [issueSSLForHostName]") print("0," + str(msg)) return 0, str(msg) @staticmethod def createAlias(masterDomain, aliasDomain, ssl, sslPath, administratorEmail, owner=None): try: admin = Administrator.objects.get(userName=owner) DNS.dnsTemplate(aliasDomain, admin) if vhost.checkIfAliasExists(aliasDomain) == 1: print("0, This domain already exists as vHost or Alias.") return if ProcessUtilities.decideServer() == ProcessUtilities.OLS: confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") data = open(confPath, 'r').readlines() writeToFile = open(confPath, 'w') listenerTrueCheck = 0 for items in data: if items.find("listener") > -1 and items.find("Default") > -1: listenerTrueCheck = 1 if items.find(' ' + masterDomain) > -1 and items.find('map') > -1 and listenerTrueCheck == 1: data = [_f for _f in items.split(" ") if _f] if data[1] == masterDomain: writeToFile.writelines(items.rstrip('\n') + ", " + aliasDomain + "\n") listenerTrueCheck = 0 else: writeToFile.writelines(items) writeToFile.close() else: completePathToConf = virtualHostUtilities.Server_root + '/conf/vhosts/' + masterDomain + '/vhost.conf' data = open(completePathToConf, 'r').readlines() writeToFile = open(completePathToConf, 'w') for items in data: if items.find('ServerAlias') > -1: items = items.strip('\n') writeToFile.writelines(items + " " + aliasDomain + "\n") else: writeToFile.writelines(items) writeToFile.close() installUtilities.installUtilities.reStartLiteSpeed() if ssl == 1: retValues = sslUtilities.issueSSLForDomain(masterDomain, administratorEmail, sslPath, aliasDomain) if ProcessUtilities.decideServer() == ProcessUtilities.OLS: if retValues[0] == 0: print("0," + str(retValues[1])) return else: vhost.createAliasSSLMap(confPath, masterDomain, aliasDomain) else: retValues = sslUtilities.issueSSLForDomain(masterDomain, administratorEmail, sslPath, aliasDomain) if retValues[0] == 0: print("0," + str(retValues[1])) return website = Websites.objects.get(domain=masterDomain) newAlias = aliasDomains(master=website, aliasDomain=aliasDomain) newAlias.save() print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [createAlias]") print("0," + str(msg)) @staticmethod def issueAliasSSL(masterDomain, aliasDomain, sslPath, administratorEmail): try: retValues = sslUtilities.issueSSLForDomain(masterDomain, administratorEmail, sslPath, aliasDomain) if ProcessUtilities.decideServer() == ProcessUtilities.OLS: confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") if retValues[0] == 0: print("0," + str(retValues[1])) return else: vhost.createAliasSSLMap(confPath, masterDomain, aliasDomain) else: if retValues[0] == 0: print("0," + str(retValues[1])) return print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [issueAliasSSL]") print("0," + str(msg)) @staticmethod def deleteAlias(masterDomain, aliasDomain): if ProcessUtilities.decideServer() == ProcessUtilities.OLS: try: confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") data = open(confPath, 'r').readlines() writeToFile = open(confPath, 'w') aliases = [] for items in data: if items.find(masterDomain) > -1 and items.find('map') > -1: data = [_f for _f in items.split(" ") if _f] if data[1] == masterDomain: length = len(data) for i in range(3, length): currentAlias = data[i].rstrip(',').strip('\n') if currentAlias != aliasDomain: aliases.append(currentAlias) aliasString = "" for alias in aliases: aliasString = ", " + alias writeToFile.writelines( ' map ' + masterDomain + " " + masterDomain + aliasString + "\n") aliases = [] aliasString = "" else: writeToFile.writelines(items) else: writeToFile.writelines(items) writeToFile.close() installUtilities.installUtilities.reStartLiteSpeed() delAlias = aliasDomains.objects.get(aliasDomain=aliasDomain) delAlias.delete() print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [deleteAlias]") print("0," + str(msg)) else: try: completePathToConf = virtualHostUtilities.Server_root + '/conf/vhosts/' + masterDomain + '/vhost.conf' data = open(completePathToConf, 'r').readlines() writeToFile = open(completePathToConf, 'w') for items in data: if items.find('ServerAlias') > -1: writeToFile.writelines(items.replace(' ' + aliasDomain, '')) else: writeToFile.writelines(items) writeToFile.close() installUtilities.installUtilities.reStartLiteSpeed() alias = aliasDomains.objects.get(aliasDomain=aliasDomain) alias.delete() print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [deleteAlias]") print("0," + str(msg)) @staticmethod def changeOpenBasedir(domainName, openBasedirValue): if ProcessUtilities.decideServer() == ProcessUtilities.OLS: try: confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + domainName completePathToConfigFile = confPath + "/vhost.conf" data = open(completePathToConfigFile, 'r').readlines() if openBasedirValue == 'Disable': writeToFile = open(completePathToConfigFile, 'w') for items in data: if items.find('php_admin_value') > -1: continue writeToFile.writelines(items) writeToFile.close() else: ## Check if phpini already active fileManagerCheck = 0 writeToFile = open(completePathToConfigFile, 'w') for items in data: if items.find('context /.filemanager') > -1: writeToFile.writelines(items) fileManagerCheck = 1 continue if items.find('phpIniOverride') > -1: writeToFile.writelines(items) if fileManagerCheck == 1: writeToFile.writelines( 'php_admin_value open_basedir "/tmp:/usr/local/lsws/Example/html/FileManager:$VH_ROOT"\n') fileManagerCheck = 0 continue else: writeToFile.writelines('php_admin_value open_basedir "/tmp:$VH_ROOT"\n') continue writeToFile.writelines(items) writeToFile.close() installUtilities.installUtilities.reStartLiteSpeed() print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [changeOpenBasedir]") print("0," + str(msg)) else: try: confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + domainName completePathToConfigFile = confPath + "/vhost.conf" data = open(completePathToConfigFile, 'r').readlines() if openBasedirValue == 'Disable': writeToFile = open(completePathToConfigFile, 'w') for items in data: if items.find('open_basedir') > -1: continue writeToFile.writelines(items) writeToFile.close() else: ## Check if phpini already active path = '' try: childDomain = ChildDomains.objects.get(domain=domainName) path = childDomain.path except: path = '/home/' + domainName + '/public_html' activate = 0 writeToFile = open(completePathToConfigFile, 'w') for items in data: if items.find('CustomLog ') > -1: activate = 1 writeToFile.writelines(items) continue if activate == 1: activate = 0 if items.find('open_basedir') > -1: writeToFile.writelines(items) continue else: writeToFile.writelines( ' php_admin_value open_basedir /usr/local/lsws/FileManager:/tmp:' + path + '\n') writeToFile.writelines(items) continue else: writeToFile.writelines(items) writeToFile.close() installUtilities.installUtilities.reStartLiteSpeed() print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [changeOpenBasedir]") print("0," + str(msg)) @staticmethod def saveSSL(virtualHost, keyPath, certPath): try: pathToStoreSSL = '/etc/letsencrypt/live/' + virtualHost command = 'mkdir -p ' + pathToStoreSSL subprocess.call(shlex.split(command)) pathToStoreSSLPrivKey = pathToStoreSSL + "/privkey.pem" pathToStoreSSLFullChain = pathToStoreSSL + "/fullchain.pem" privkey = open(pathToStoreSSLPrivKey, 'w') privkey.write(open(keyPath, "r").read()) privkey.close() fullchain = open(pathToStoreSSLFullChain, 'w') fullchain.write(open(certPath, "r").read()) fullchain.close() os.remove(keyPath) os.remove(certPath) sslUtilities.sslUtilities.installSSLForDomain(virtualHost) installUtilities.installUtilities.reStartLiteSpeed() FNULL = open(os.devnull, 'w') command = "chown " + "lsadm" + ":" + "lsadm" + " " + pathToStoreSSL cmd = shlex.split(command) subprocess.call(cmd, stdout=FNULL, stderr=subprocess.STDOUT) command = 'chmod 600 %s' % (pathToStoreSSLPrivKey) ProcessUtilities.normalExecutioner(command) print("1,None") except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [saveSSL]") print("0," + str(msg)) @staticmethod def createDomain(masterDomain, virtualHostName, phpVersion, path, ssl, dkimCheck, openBasedir, owner, apache, tempStatusPath='/home/cyberpanel/fakePath', LimitsCheck=1, alias = 0): try: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Running some checks..,0') ## Check if this domain either exists as website or child domain admin = Administrator.objects.get(userName=owner) master = Websites.objects.get(domain=masterDomain) if LimitsCheck: DNS.dnsTemplate(virtualHostName, admin) if Websites.objects.filter(domain=virtualHostName).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This Domain already exists as a website. [404]') return 0, "This Domain already exists as a website." if Websites.objects.filter(domain=virtualHostName.lstrip('www.')).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This Domain already exists as a website. [404]') return 0, "This Domain already exists as a website." if ChildDomains.objects.filter(domain=virtualHostName).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This domain already exists as child domain. [404]') return 0, "This domain already exists as child domain." if ChildDomains.objects.filter(domain=virtualHostName.lstrip('www.')).count() > 0: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This domain already exists as child domain. [404]') return 0, "This domain already exists as child domain." ####### Limitations check domainsInPackage = master.package.allowedDomains if master.package.allowFullDomain == 0: if virtualHostName.find(masterDomain) > -1: pass else: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Fully qualified domain is not allowed in the package. [404]') return 0, "Fully qualified domain is not allowed in the package." if domainsInPackage == 0: pass elif domainsInPackage > master.childdomains_set.all().count(): pass else: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Exceeded maximum number of domains for this package. [404]') return 0, "Exceeded maximum number of domains for this package" ####### Limitations Check End if vhost.checkIfVirtualHostExists(virtualHostName) == 1: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Virtual Host Directory already exists. [404]') return 0, "Virtual Host Directory already exists!" if vhost.checkIfAliasExists(virtualHostName) == 1: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'This domain exists as Alias. [404]') #return 0, "This domain exists as Alias." logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'DKIM Setup..,30') postFixPath = '/home/cyberpanel/postfix' if os.path.exists(postFixPath): retValues = mailUtilities.setupDKIM(virtualHostName) if retValues[0] == 0: raise BaseException(retValues[1]) FNULL = open(os.devnull, 'w') logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Creating configurations..,50') retValues = vhost.createDirectoryForDomain(masterDomain, virtualHostName, phpVersion, path, master.adminEmail, master.externalApp, openBasedir) if retValues[0] == 0: raise BaseException(retValues[1]) if not os.path.exists(virtualHostUtilities.redisConf): retValues = vhost.createConfigInMainDomainHostFile(virtualHostName, masterDomain) if retValues[0] == 0: raise BaseException(retValues[1]) ## Now restart litespeed after initial configurations are done if LimitsCheck: website = ChildDomains(master=master, domain=virtualHostName, path=path, phpSelection=phpVersion, ssl=ssl, alais=alias) website.save() if ssl == 1: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Creating SSL..,50') if not os.path.exists(virtualHostUtilities.redisConf): installUtilities.installUtilities.reStartLiteSpeed() retValues = sslUtilities.issueSSLForDomain(virtualHostName, master.adminEmail, path) if not os.path.exists(virtualHostUtilities.redisConf): installUtilities.installUtilities.reStartLiteSpeed() if retValues[0] == 0: raise BaseException(retValues[1]) ## Final Restart if ssl == 0: if not os.path.exists(virtualHostUtilities.redisConf): installUtilities.installUtilities.reStartLiteSpeed() vhost.finalizeDomainCreation(master.externalApp, path) ## Apache Settings confPath = vhost.Server_root + "/conf/vhosts/" + virtualHostName completePathToConfigFile = confPath + "/vhost.conf" if apache: if ProcessUtilities.decideServer() == ProcessUtilities.OLS: if ApacheController.checkIfApacheInstalled() == 0: result = ApacheController.setupApache(tempStatusPath) if result[0] == 0: raise BaseException(result[1]) result = ApacheVhost.setupApacheVhostChild(master.adminEmail, master.externalApp, master.externalApp, phpVersion, virtualHostName, path) if result[0] == 0: raise BaseException(result[1]) else: ApacheVhost.perHostVirtualConfOLS(completePathToConfigFile, master.adminEmail) installUtilities.installUtilities.reStartLiteSpeed() php = PHPManager.getPHPString(phpVersion) phpService = ApacheVhost.DecideFPMServiceName(phpVersion) command = f"systemctl restart {phpService}" ProcessUtilities.normalExecutioner(command) ## DKIM Check postFixPath = '/home/cyberpanel/postfix' if os.path.exists(postFixPath): if dkimCheck == 1: DNS.createDKIMRecords(virtualHostName) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Domain successfully created. [200]') return 1, "None" except BaseException as msg: if ACLManager.FindIfChild() == 0: numberOfWebsites = Websites.objects.count() + ChildDomains.objects.count() vhost.deleteCoreConf(virtualHostName, numberOfWebsites) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, str(msg) + ". [404]") logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [createDomain]") return 0, str(msg) @staticmethod def deleteDomain(virtualHostName, DeleteDocRoot=0): try: numberOfWebsites = Websites.objects.count() + ChildDomains.objects.count() vhost.deleteCoreConf(virtualHostName, numberOfWebsites) delWebsite = ChildDomains.objects.get(domain=virtualHostName) if DeleteDocRoot: command = 'rm -rf %s' % (delWebsite.path) ProcessUtilities.executioner(command) delWebsite.delete() installUtilities.installUtilities.reStartLiteSpeed() print("1,None") return 1, 'None' except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile( str(msg) + " [deleteDomain]") print("0," + str(msg)) return 0, str(msg) @staticmethod def switchServer(virtualHostName, phpVersion, server, tempStatusPath): try: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Starting Conversion..,0') child = 0 try: website = Websites.objects.get(domain=virtualHostName) except: website = ChildDomains.objects.get(domain=virtualHostName) child = 1 confPath = vhost.Server_root + "/conf/vhosts/" + virtualHostName completePathToConfigFile = confPath + "/vhost.conf" if server == virtualHostUtilities.apache: if os.path.exists(completePathToConfigFile): os.remove(completePathToConfigFile) if ApacheController.checkIfApacheInstalled() == 0: result = ApacheController.setupApache(tempStatusPath) if result[0] == 0: raise BaseException(result[1]) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Creating apache configurations..,90') if child: ApacheVhost.perHostVirtualConfOLS(completePathToConfigFile, website.master.adminEmail) else: ApacheVhost.perHostVirtualConfOLS(completePathToConfigFile, website.adminEmail) if child: ApacheVhost.setupApacheVhostChild(website.master.adminEmail, website.master.externalApp, website.master.externalApp, phpVersion, virtualHostName, website.path) else: ApacheVhost.setupApacheVhost(website.adminEmail, website.externalApp, website.externalApp, phpVersion, virtualHostName) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Restarting servers and phps..,90') php = PHPManager.getPHPString(phpVersion) ## phpService = ApacheVhost.DecideFPMServiceName(phpVersion) # if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: # phpService = f'php{php}-php-fpm' # else: # phpService = f"{phpVersion.replace(' ', '').lower()}-fpm" command = f"systemctl stop {phpService}" ProcessUtilities.normalExecutioner(command) command = f"systemctl restart {phpService}" ProcessUtilities.normalExecutioner(command) command = f"systemctl restart {ApacheVhost.serviceName}" ProcessUtilities.normalExecutioner(command) ### installUtilities.installUtilities.reStartLiteSpeed() logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Successfully converted.[200]') else: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Starting Conversion..,0') ApacheVhost.DeleteApacheVhost(virtualHostName) if child: vhost.perHostDomainConf(website.path, website.master.domain, virtualHostName, completePathToConfigFile, website.master.adminEmail, phpVersion, website.master.externalApp, 0) else: vhost.perHostVirtualConf(completePathToConfigFile, website.adminEmail, website.externalApp, phpVersion, virtualHostName, 0) sslFCPath = f'/etc/letsencrypt/live/{virtualHostName}/fullchain.pem' if os.path.exists(sslFCPath): sslUtilities.sslUtilities.installSSLForDomain(virtualHostName, website.adminEmail) logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Restarting server..,90') installUtilities.installUtilities.reStartLiteSpeed() logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, 'Successfully converted. [200]') except BaseException as msg: logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, '%s[404]' % str(msg)) logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [switchServer]") @staticmethod def getDiskUsage(path, totalAllowed): try: totalUsageInMB = \ subprocess.check_output('du -hs %s --block-size=1M' % (path), shell=True).decode("utf-8").split()[0] percentage = float(100) / float(totalAllowed) percentage = float(percentage) * float(totalUsageInMB) data = [int(totalUsageInMB), int(percentage)] return data except BaseException: try: return [int(totalUsageInMB), int(0)] except: return [int(0), int(0)] @staticmethod def getDiskUsageofPath(path): try: return subprocess.check_output('du -hs %s --block-size=1M' % (path), shell=True).decode("utf-8").split()[0] except BaseException: return '0MB' @staticmethod def permissionControl(path): try: command = 'sudo chown -R cyberpanel:cyberpanel ' + path cmd = shlex.split(command) res = subprocess.call(cmd) except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) @staticmethod def leaveControl(path): try: command = 'sudo chown -R root:root ' + path cmd = shlex.split(command) res = subprocess.call(cmd) except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) @staticmethod def FindStats(website): import json try: config = json.loads(website.config) DiskUsage = config['DiskUsage'] DiskUsagePercentage = config['DiskUsagePercentage'] bwInMB = config['bwInMB'] bwUsage = config['bwUsage'] except: DiskUsage = 0 DiskUsagePercentage = 0 bwInMB = 0 bwUsage = 0 return DiskUsage, DiskUsagePercentage, bwInMB, bwUsage @staticmethod def EnableDisablePP(vhostName, username=None, password=None, path=None, wpid=None, externalApp=None): try: vhostPassDir = f'/home/{vhostName}' uBuntuPath = '/etc/lsb-release' if os.path.exists(uBuntuPath): group = 'nogroup' else: group = 'nobody' confPath = f'{virtualHostUtilities.vhostConfPath}/vhosts/{vhostName}/vhost.conf' htpassword = f'{vhostPassDir}/{wpid}' htpasstemp = f'/usr/local/CyberCP/{wpid}' command = f'touch {htpasstemp}' ProcessUtilities.executioner(command) command = f'chown {externalApp}:{group} {htpasstemp}' ProcessUtilities.executioner(command) FindLine = f'PASSWORD PROTECTION CONF STARTS {path}' FindLineEnd = f'PASSWORD PROTECTION CONF ENDS {path}' if ProcessUtilities.decideServer() == ProcessUtilities.OLS: if os.path.exists(htpassword): command = f'rm -f {htpassword}' ProcessUtilities.executioner(command, externalApp) # os.remove(htpassword) removeCheck = 0 data = open(confPath, 'r').readlines() writeToFile = open(confPath, 'w') for line in data: if line.find(FindLine) > -1: removeCheck = 1 continue if line.find(FindLineEnd) > -1: removeCheck = 0 continue if removeCheck == 0: writeToFile.writelines(line) writeToFile.close() else: writeToFile = open(confPath, 'a') from vhostConfs import vhostConfs OLSPPConf = vhostConfs.OLSPPConf OLSPPConf = OLSPPConf.replace('{{RealM_Name}}', str(randint(1000, 9999))) OLSPPConf = OLSPPConf.replace('{{path}}', path) OLSPPConf = OLSPPConf.replace('{{wpid}}', wpid) OLSPPConf = OLSPPConf.replace('{{PassFile}}', htpassword) writeToFile.write(OLSPPConf) writeToFile.close() ### import bcrypt password = password.encode() hashed = bcrypt.hashpw(password, bcrypt.gensalt()) UserPass = f'{username}:{hashed.decode()}:{username}' writeToFile = open(htpasstemp, 'w') writeToFile.write(UserPass) writeToFile.close() command = f'cp {htpasstemp} {htpassword}' ProcessUtilities.executioner(command, externalApp) os.remove(htpasstemp) command = f'chmod 640 {htpassword}' ProcessUtilities.executioner(command, externalApp, True) command = f'sudo -u {externalApp} -g {group} chown {externalApp}:{group} {htpassword}' ProcessUtilities.executioner(command) else: RealmName = str(randint(1000, 9999)) htaccesspath = f'{path}/.htaccess' if os.path.exists(htpassword): command = f'rm -f {htpassword}' ProcessUtilities.executioner(command, externalApp) # os.remove(htpassword) removeCheck = 0 if os.path.exists(htaccesspath): data = open(htaccesspath, 'r').readlines() writeToFile = open(htaccesspath, 'w') for line in data: if line.find(FindLine) > -1: removeCheck = 1 continue if line.find(FindLineEnd) > -1: removeCheck = 0 continue if removeCheck == 0: writeToFile.writelines(line) writeToFile.close() else: writeToFile = open(htaccesspath, 'a') from vhostConfs import vhostConfs LSWSPPProtection = vhostConfs.LSWSPPProtection LSWSPPProtection = LSWSPPProtection.replace('{{RealM_Name}}', RealmName) LSWSPPProtection = LSWSPPProtection.replace('{{path}}', path) LSWSPPProtection = LSWSPPProtection.replace('{{PassFile}}', htpassword) writeToFile.write(LSWSPPProtection) writeToFile.close() ### import bcrypt password = password.encode() hashed = bcrypt.hashpw(password, bcrypt.gensalt()) UserPass = f'{username}:{hashed.decode()}:{username}' writeToFile = open(htpasstemp, 'w') writeToFile.write(UserPass) writeToFile.close() command = f'cp {htpasstemp} {htpassword}' ProcessUtilities.executioner(command, externalApp) os.remove(htpasstemp) command = f'chmod 640 {htpassword}' ProcessUtilities.executioner(command, externalApp, True) command = f'sudo -u {externalApp} -g {group} chown {externalApp}:{group} {htpassword}' ProcessUtilities.executioner(command) installUtilities.installUtilities.reStartLiteSpeed() print('1,None') except BaseException as msg: print(f'0,{str(msg)}') return 0, str(msg) def main(): parser = argparse.ArgumentParser(description='CyberPanel Installer') parser.add_argument('function', help='Specific a function to call!') parser.add_argument('--virtualHostName', help='Domain name!') parser.add_argument('--administratorEmail', help='Administration Email!') parser.add_argument('--phpVersion', help='PHP Version') parser.add_argument("--virtualHostUser", help="Virtual Host Directory Owner and Group!") parser.add_argument("--numberOfSites", help="Number of sites!") parser.add_argument("--ssl", help="Weather to activate SSL") parser.add_argument("--sslPath", help="Path to website document root!") parser.add_argument('--dkimCheck', help='To enable or disable DKIM support for domain.') parser.add_argument('--openBasedir', help='To enable or disable open_basedir protection for domain.') parser.add_argument('--websiteOwner', help='Website Owner Name') parser.add_argument('--package', help='Website package') parser.add_argument('--restore', help='Restore Check.') parser.add_argument('--apache', help='Enable/Disable Apache as backend') ## arguments for creation child domains parser.add_argument('--masterDomain', help='Master Domain Needed While Creating Child Domains!') parser.add_argument('--path', help='Path Needed for Child domains Creation!') parser.add_argument('--restart', help='OLS Restart Frequency while child domain creation!') ## arguments for logs parser.add_argument('--page', help='Page number to fetch logs!') ## arguments for configuration files parser.add_argument('--tempPath', help='Temporary path where configuration data is placed!') ## save ssl arguments parser.add_argument('--tempKeyPath', help='Temporary path to store key!') parser.add_argument('--tempCertPath', help='Temporary path to store cert!') parser.add_argument('--sslCheck', help='Weather SSL is already activated or not!') ## install wordpress arguments parser.add_argument('--dbName', help='Database Name!') parser.add_argument('--dbUser', help='Database User!') parser.add_argument('--dbPassword', help='Database Password!') ## calculate bw arguments parser.add_argument('--bandwidth', help='Pack Bandwidth!') ## extras parser.add_argument('--username', help='Admin Username!') parser.add_argument('--password', help='Admin Password!') parser.add_argument('--prefix', help='Database Prefix!') parser.add_argument('--sitename', help='Site Name!') ## Arguments for alias domain parser.add_argument('--aliasDomain', help='Alias Domain!') ## Arguments for OpenBasedir parser.add_argument('--openBasedirValue', help='open_base dir protection value!') parser.add_argument('--tempStatusPath', help='Temporary Status file path.') parser.add_argument('--mailDomain', help='To create or not to create mail domain.') ## Switch Server parser.add_argument('--server', help='Switch server parameter.') parser.add_argument('--wpid', help='WordPress ID') ## Doc root deletion for child domain parser.add_argument('--DeleteDocRoot', help='Doc root deletion for child domain.') ### for onboarding parser.add_argument('--rdns', help='Doc root deletion for child domain.') args = parser.parse_args() if args.function == "createVirtualHost": try: dkimCheck = int(args.dkimCheck) except: dkimCheck = 0 try: openBasedir = int(args.openBasedir) except: openBasedir = 0 try: apache = int(args.apache) except: apache = 0 try: tempStatusPath = args.tempStatusPath except: tempStatusPath = '/home/cyberpanel/fakePath' virtualHostUtilities.createVirtualHost(args.virtualHostName, args.administratorEmail, args.phpVersion, args.virtualHostUser, int(args.ssl), dkimCheck, openBasedir, args.websiteOwner, args.package, apache, tempStatusPath, int(args.mailDomain)) elif args.function == "setupAutoDiscover": admin = Administrator.objects.get(userName=args.websiteOwner) virtualHostUtilities.setupAutoDiscover(1, '/home/cyberpanel/templogs', args.virtualHostName, admin) elif args.function == "deleteVirtualHostConfigurations": vhost.deleteVirtualHostConfigurations(args.virtualHostName) elif args.function == "createDomain": try: dkimCheck = int(args.dkimCheck) except: dkimCheck = 0 try: openBasedir = int(args.openBasedir) except: openBasedir = 0 try: apache = int(args.apache) except: apache = 0 try: tempStatusPath = args.tempStatusPath except: tempStatusPath = '/home/cyberpanel/fakePath' try: aliasDomain = int(args.aliasDomain) except: aliasDomain = 0 virtualHostUtilities.createDomain(args.masterDomain, args.virtualHostName, args.phpVersion, args.path, int(args.ssl), dkimCheck, openBasedir, args.websiteOwner, apache, tempStatusPath, 1, aliasDomain) elif args.function == "issueSSL": virtualHostUtilities.issueSSL(args.virtualHostName, args.path, args.administratorEmail) elif args.function == "issueSSLv2": virtualHostUtilities.issueSSLv2(args.virtualHostName, args.path, args.administratorEmail) elif args.function == "changePHP": vhost.changePHP(args.path, args.phpVersion) elif args.function == "getAccessLogs": virtualHostUtilities.getAccessLogs(args.path, int(args.page)) elif args.function == "getErrorLogs": virtualHostUtilities.getErrorLogs(args.path, int(args.page)) elif args.function == "saveVHostConfigs": virtualHostUtilities.saveVHostConfigs(args.path, args.tempPath) elif args.function == "saveApacheConfigsToFile": virtualHostUtilities.saveApacheConfigsToFile(args.path, args.tempPath) elif args.function == "saveRewriteRules": virtualHostUtilities.saveRewriteRules(args.virtualHostName, args.path, args.tempPath) elif args.function == "saveSSL": virtualHostUtilities.saveSSL(args.virtualHostName, args.tempKeyPath, args.tempCertPath) elif args.function == "installWordPress": virtualHostUtilities.installWordPress(args.virtualHostName, args.path, args.virtualHostUser, args.dbName, args.dbUser, args.dbPassword) elif args.function == "installJoomla": virtualHostUtilities.installJoomla(args.virtualHostName, args.path, args.virtualHostUser, args.dbName, args.dbUser, args.dbPassword, args.username, args.password, args.prefix, args.sitename, args.tempStatusPath) elif args.function == "issueSSLForHostName": virtualHostUtilities.issueSSLForHostName(args.virtualHostName, args.path) elif args.function == "issueSSLForMailServer": virtualHostUtilities.issueSSLForMailServer(args.virtualHostName, args.path) elif args.function == "findDomainBW": vhost.findDomainBW(args.virtualHostName, int(args.bandwidth)) elif args.function == 'createAlias': virtualHostUtilities.createAlias(args.masterDomain, args.aliasDomain, int(args.ssl), args.sslPath, args.administratorEmail, args.websiteOwner) elif args.function == 'issueAliasSSL': virtualHostUtilities.issueAliasSSL(args.masterDomain, args.aliasDomain, args.sslPath, args.administratorEmail) elif args.function == 'deleteAlias': virtualHostUtilities.deleteAlias(args.masterDomain, args.aliasDomain) elif args.function == 'changeOpenBasedir': virtualHostUtilities.changeOpenBasedir(args.virtualHostName, args.openBasedirValue) elif args.function == 'deleteDomain': virtualHostUtilities.deleteDomain(args.virtualHostName, int(args.DeleteDocRoot)) elif args.function == 'switchServer': virtualHostUtilities.switchServer(args.virtualHostName, args.phpVersion, int(args.server), args.tempStatusPath) elif args.function == 'EnableDisablePP': virtualHostUtilities.EnableDisablePP(args.virtualHostName, args.username, args.password, args.path, args.wpid, args.virtualHostUser) elif args.function == 'OnBoardingHostName': # in virtualHostName pass domain for which hostname should be set up # in path pass temporary path where status of the function will be stored virtualHostUtilities.OnBoardingHostName(args.virtualHostName, args.path, int(args.rdns)) if __name__ == "__main__": main()
| ver. 1.4 |
Github
|
.
| PHP 8.2.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings