diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index fd134fb60..b36e2a2df 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -359,27 +359,32 @@ class CloudManager: try: statusFile = self.data['statusFile'] statusData = open(statusFile, 'r').readlines() - lastLine = statusData[-1] - - if lastLine.find('[200]') > -1: - command = 'sudo rm -f ' + statusFile - ProcessUtilities.executioner(command) - data_ret = {'status': 1, 'abort': 1, 'installationProgress': "100", 'currentStatus': lastLine} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - elif lastLine.find('[404]') > -1: - data_ret = {'status': 0, 'abort': 1, 'installationProgress': "0", 'error_message': lastLine} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - progress = lastLine.split(',') - currentStatus = progress[0] - try: - installationProgress = progress[1] - except: - installationProgress = 0 - data_ret = {'status': 1, 'abort': 0, 'installationProgress': installationProgress, - 'currentStatus': currentStatus} + try: + lastLine = statusData[-1] + if lastLine.find('[200]') > -1: + command = 'rm -f ' + statusFile + ProcessUtilities.executioner(command) + data_ret = {'status': 1, 'abort': 1, 'installationProgress': "100", 'currentStatus': lastLine} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + elif lastLine.find('[404]') > -1: + data_ret = {'status': 0, 'abort': 1, 'installationProgress': "0", 'error_message': lastLine} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + else: + progress = lastLine.split(',') + currentStatus = progress[0] + try: + installationProgress = progress[1].rstrip('\n') + except: + installationProgress = 0 + data_ret = {'status': 1, 'abort': 0, 'installationProgress': installationProgress, + 'currentStatus': currentStatus} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except IndexError: + data_ret = {'status': 1, 'abort': 0, 'installationProgress': 0, + 'currentStatus': 'Working..'} json_data = json.dumps(data_ret) return HttpResponse(json_data) @@ -1462,4 +1467,174 @@ class CloudManager: request.session['userID'] = self.admin.pk return getUsageData(request) except BaseException as msg: - return self.ajaxPre(0, str(msg)) \ No newline at end of file + return self.ajaxPre(0, str(msg)) + + def RunServerLevelEmailChecks(self): + try: + + tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + reportFile = "/home/cyberpanel/" + str(randint(1000, 9999)) + + extraArgs = {'tempStatusPath': tempStatusPath, 'reportFile': reportFile} + + background = MailServerManager(None, 'RunServerLevelEmailChecks', extraArgs) + background.start() + + final_dic = {'status': 1, 'tempStatusPath': tempStatusPath, 'reportFile': reportFile} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def ReadReport(self): + try: + reportFile = self.data['reportFile'] + reportContent = open(reportFile, 'r').read() + + data_ret = {'status': 1, 'reportContent': reportContent} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'status': 0, 'abort': 0, 'installationProgress': "0", 'errorMessage': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + def ResetEmailConfigurations(self): + try: + + tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + writeToFile = open(tempStatusPath, 'w') + writeToFile.write('Starting..,0') + writeToFile.close() + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/mailServer/mailserverManager.py" + execPath = execPath + ' ResetEmailConfigurations --tempStatusPath %s' % (tempStatusPath) + + ProcessUtilities.popenExecutioner(execPath) + + final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def fetchAllSites(self): + try: + currentACL = ACLManager.loadedACL(self.admin.pk) + websites = ACLManager.findAllWebsites(currentACL, self.admin.pk) + + final_dic = {'status': 1, 'websites': websites} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def debugEmailForSite(self): + try: + + websiteName = self.data['websiteName'] + result = MailServerManager(None, 'debugEmailForSite', None).debugEmailForSite(websiteName) + + if result[0]: + final_dic = {'error_message': result[1], 'status': 1} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + else: + final_dic = {'error_message': result[1], 'status': 0} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def fixMailSSL(self, request): + try: + + request.session['userID'] = self.admin.pk + msM = MailServerManager(request) + return msM.fixMailSSL(self.data) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def ReadReportFTP(self): + try: + command = 'ps aux' + result = ProcessUtilities.outputExecutioner(command) + + FTP = 1 + if result.find('pure-ftpd') == -1: + FTP = 0 + + data_ret = {'status': 1, 'FTP': FTP} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'status': 0, 'abort': 0, 'installationProgress': "0", 'errorMessage': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + def ResetFTPConfigurations(self): + try: + + tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + writeToFile = open(tempStatusPath, 'w') + writeToFile.write('Starting..,0') + writeToFile.close() + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/ftp/ftpManager.py" + execPath = execPath + ' ResetFTPConfigurations --tempStatusPath %s' % (tempStatusPath) + + ProcessUtilities.popenExecutioner(execPath) + + final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def ReadReportDNS(self): + try: + command = 'ps aux' + result = ProcessUtilities.outputExecutioner(command) + + DNS = 1 + if result.find('pdns_server --guardian=no') == -1: + DNS = 0 + + data_ret = {'status': 1, 'DNS': DNS} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'status': 0, 'abort': 0, 'installationProgress': "0", 'errorMessage': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + def ResetDNSConfigurations(self): + try: + + tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + writeToFile = open(tempStatusPath, 'w') + writeToFile.write('Starting..,0') + writeToFile.close() + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/dns/dnsManager.py" + execPath = execPath + ' ResetDNSConfigurations --tempStatusPath %s' % (tempStatusPath) + + ProcessUtilities.popenExecutioner(execPath) + + final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) diff --git a/cloudAPI/views.py b/cloudAPI/views.py index d3d552dc3..ee7807470 100755 --- a/cloudAPI/views.py +++ b/cloudAPI/views.py @@ -16,7 +16,6 @@ def router(request): serverUserName = data['serverUserName'] admin = Administrator.objects.get(userName=serverUserName) - cm = CloudManager(data, admin) if admin.api == 0: @@ -32,6 +31,26 @@ def router(request): if controller == 'verifyLogin': return cm.verifyLogin(request)[1] + elif controller == 'RunServerLevelEmailChecks': + return cm.RunServerLevelEmailChecks() + elif controller == 'ReadReport': + return cm.ReadReport() + elif controller == 'ResetEmailConfigurations': + return cm.ResetEmailConfigurations() + elif controller == 'fetchAllSites': + return cm.fetchAllSites() + elif controller == 'debugEmailForSite': + return cm.debugEmailForSite() + elif controller == 'fixMailSSL': + return cm.fixMailSSL(request) + elif controller == 'ReadReportFTP': + return cm.ReadReportFTP() + elif controller == 'ResetFTPConfigurations': + return cm.ResetFTPConfigurations() + elif controller == 'ReadReportDNS': + return cm.ReadReportDNS() + elif controller == 'ResetDNSConfigurations': + return cm.ResetDNSConfigurations() elif controller == 'fetchWebsites': return cm.fetchWebsites() elif controller == 'fetchWebsiteDataJSON': @@ -316,6 +335,7 @@ def access(request): try: serverUserName = request.GET.get('serverUserName') token = request.GET.get('token') + redirectFinal = request.GET.get('redirect') admin = Administrator.objects.get(userName=serverUserName) @@ -326,7 +346,11 @@ def access(request): request.session['userID'] = admin.pk from django.shortcuts import redirect from baseTemplate.views import renderBase - return redirect(renderBase) + if redirectFinal == None: + return redirect(renderBase) + else: + from django.shortcuts import redirect + return redirect(redirectFinal) else: return HttpResponse('Unauthorized access.') diff --git a/dns/dnsManager.py b/dns/dnsManager.py index d65a61376..fbbcdf73b 100755 --- a/dns/dnsManager.py +++ b/dns/dnsManager.py @@ -1,4 +1,6 @@ #!/usr/local/CyberCP/bin/python +import argparse +import errno import os.path import sys import django @@ -8,20 +10,27 @@ django.setup() from django.shortcuts import render from django.http import HttpResponse import json -from plogical.dnsUtilities import DNS -from loginSystem.models import Administrator +try: + from plogical.dnsUtilities import DNS + from loginSystem.models import Administrator + from .models import Domains,Records + from plogical.mailUtilities import mailUtilities +except: + pass import os -from .models import Domains,Records from re import match,I,M -from plogical.mailUtilities import mailUtilities from plogical.acl import ACLManager import CloudFlare import re -from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +import plogical.CyberCPLogFileWriter as logging +from plogical.processUtilities import ProcessUtilities class DNSManager: defaultNameServersPath = '/home/cyberpanel/defaultNameservers' + def __init__(self, extraArgs=None): + self.extraArgs = extraArgs + def loadCFKeys(self): cfFile = '%s%s' % (DNS.CFPath, self.admin.userName) data = open(cfFile, 'r').readlines() @@ -1139,4 +1148,184 @@ class DNSManager: except BaseException as msg: final_dic = {'status': 0, 'delete_status': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) - return HttpResponse(final_json) \ No newline at end of file + return HttpResponse(final_json) + + def installPowerDNS(self): + try: + + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + + command = 'systemctl stop systemd-resolved' + ProcessUtilities.executioner(command) + command = 'systemctl disable systemd-resolved.service' + ProcessUtilities.executioner(command) + + try: + os.rename('/etc/resolv.conf', 'etc/resolved.conf') + except OSError as e: + try: + os.remove('/etc/resolv.conf') + except OSError as e1: + pass + + + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + + command = 'DEBIAN_FRONTEND=noninteractive apt-get -y remove pdns-server pdns-backend-mysql -y' + os.system(command) + + command = "DEBIAN_FRONTEND=noninteractive apt-get -y install pdns-server pdns-backend-mysql" + os.system(command) + return 1 + else: + + command = 'yum -y remove pdns pdns-backend-mysql' + os.system(command) + + command = 'yum -y install pdns pdns-backend-mysql' + + ProcessUtilities.executioner(command) + + return 1 + + except BaseException as msg: + return 0 + + def installPowerDNSConfigurations(self, mysqlPassword): + try: + + if ProcessUtilities.decideDistro() == ProcessUtilities.cent8 or ProcessUtilities.decideDistro() == ProcessUtilities.centos: + dnsPath = "/etc/pdns/pdns.conf" + else: + dnsPath = "/etc/powerdns/pdns.conf" + + import shutil + + if os.path.exists(dnsPath): + os.remove(dnsPath) + shutil.copy("/usr/local/CyberCP/install/dns-one/pdns.conf", dnsPath) + else: + shutil.copy("/usr/local/CyberCP/install/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) + + writeDataToFile.close() + + + if self.remotemysql == 'ON': + command = "sed -i 's|gmysql-host=localhost|gmysql-host=%s|g' %s" % (self.mysqlhost, dnsPath) + ProcessUtilities.executioner(command) + + command = "sed -i 's|gmysql-port=3306|gmysql-port=%s|g' %s" % (self.mysqlport, dnsPath) + ProcessUtilities.executioner(command) + + return 1 + except IOError as msg: + return 0 + + def startPowerDNS(self): + + ############## Start PowerDNS ###################### + + command = 'systemctl enable pdns' + ProcessUtilities.executioner(command) + + command = 'systemctl start pdns' + ProcessUtilities.executioner(command) + + return 1 + + def ResetDNSConfigurations(self): + try: + + ### Check if remote or local mysql + + passFile = "/etc/cyberpanel/mysqlPassword" + + try: + jsonData = json.loads(ProcessUtilities.outputExecutioner('cat %s' % (passFile))) + + self.mysqluser = jsonData['mysqluser'] + self.mysqlpassword = jsonData['mysqlpassword'] + self.mysqlport = jsonData['mysqlport'] + self.mysqlhost = jsonData['mysqlhost'] + self.remotemysql = 'ON' + + if self.mysqlhost.find('rds.amazon') > -1: + self.RDS = 1 + + ## Also set localhost to this server + + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddressLocal = ipData.split('\n', 1)[0] + + self.LOCALHOST = ipAddressLocal + except BaseException as msg: + self.remotemysql = 'OFF' + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile('%s. [setupConnection:75]' % (str(msg))) + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Removing and re-installing DNS..,5') + + if self.installPowerDNS() == 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], + 'installPowerDNS failed. [404].') + return 0 + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Resetting configurations..,40') + + import sys + sys.path.append('/usr/local/CyberCP') + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") + from CyberCP import settings + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Configurations reset..,70') + + if self.installPowerDNSConfigurations(settings.DATABASES['default']['PASSWORD']) == 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'installPowerDNSConfigurations failed. [404].') + return 0 + + if self.startPowerDNS() == 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], + 'startPowerDNS failed. [404].') + return 0 + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Fixing permissions..,90') + + from mailServer.mailserverManager import MailServerManager + MailServerManager(None, None, None).fixCyberPanelPermissions() + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') + + except BaseException as msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def main(): + + parser = argparse.ArgumentParser(description='CyberPanel') + parser.add_argument('function', help='Specify a function to call!') + parser.add_argument('--tempStatusPath', help='Path of temporary status file.') + + args = parser.parse_args() + + if args.function == "ResetDNSConfigurations": + extraArgs = {'tempStatusPath': args.tempStatusPath} + ftp = DNSManager(extraArgs) + ftp.ResetDNSConfigurations() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/ftp/ftpManager.py b/ftp/ftpManager.py index c57cc421d..3812d57a9 100755 --- a/ftp/ftpManager.py +++ b/ftp/ftpManager.py @@ -8,18 +8,28 @@ django.setup() import json from django.shortcuts import render,redirect from django.http import HttpResponse -from .models import Users -from loginSystem.models import Administrator +try: + from .models import Users + from loginSystem.models import Administrator +except: + pass import plogical.CyberCPLogFileWriter as logging -from loginSystem.views import loadLoginPage -from websiteFunctions.models import Websites -from plogical.ftpUtilities import FTPUtilities +try: + from loginSystem.views import loadLoginPage + from websiteFunctions.models import Websites + from plogical.ftpUtilities import FTPUtilities + from plogical.acl import ACLManager +except: + pass import os -from plogical.acl import ACLManager + +from plogical.processUtilities import ProcessUtilities +import argparse class FTPManager: - def __init__(self, request): + def __init__(self, request, extraArgs = None): self.request = request + self.extraArgs = extraArgs def loadFTPHome(self): try: @@ -285,4 +295,258 @@ class FTPManager: except BaseException as msg: data_ret = {'status': 0, 'changePasswordStatus': 0, 'error_message': str(msg)} json_data = json.dumps(data_ret) - return HttpResponse(json_data) \ No newline at end of file + return HttpResponse(json_data) + + def installPureFTPD(self): + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + + command = 'DEBIAN_FRONTEND=noninteractive apt remove pure-ftp* -y' + os.system(command) + + command = 'DEBIAN_FRONTEND=noninteractive apt install pure-ftpd-mysql -y' + os.system(command) + + command = 'DEBIAN_FRONTEND=noninteractive apt install pure-ftpd-mysql -y' + os.system(command) + + if ProcessUtilities.decideDistro() != ProcessUtilities.ubuntu20: + command = 'wget https://rep.cyberpanel.net/pure-ftpd-common_1.0.47-3_all.deb' + ProcessUtilities.executioner(command) + + command = 'wget https://rep.cyberpanel.net/pure-ftpd-mysql_1.0.47-3_amd64.deb' + ProcessUtilities.executioner(command) + + command = 'dpkg --install --force-confold pure-ftpd-common_1.0.47-3_all.deb' + ProcessUtilities.executioner(command) + + command = 'dpkg --install --force-confold pure-ftpd-mysql_1.0.47-3_amd64.deb' + ProcessUtilities.executioner(command) + + elif ProcessUtilities.decideDistro() == ProcessUtilities.centos: + + command = 'yum remove pure-ftp* -y' + os.system(command) + + command = "yum install -y pure-ftpd" + ProcessUtilities.executioner(command) + elif ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + + command = 'yum remove pure-ftp* -y' + os.system(command) + + command = 'dnf install pure-ftpd -y' + ProcessUtilities.executioner(command) + + ####### Install pureftpd to system startup + + def pureFTPDServiceName(): + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + return 'pure-ftpd-mysql' + return 'pure-ftpd' + + command = "systemctl enable " + pureFTPDServiceName() + ProcessUtilities.executioner(command) + + ###### FTP Groups and user settings settings + + command = 'groupadd -g 2001 ftpgroup' + ProcessUtilities.executioner(command) + + command = 'useradd -u 2001 -s /bin/false -d /bin/null -c "pureftpd user" -g ftpgroup ftpuser' + ProcessUtilities.executioner(command) + + return 1 + + def startPureFTPD(self): + ############## Start pureftpd ###################### + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + command = 'systemctl start pure-ftpd-mysql' + else: + command = 'systemctl start pure-ftpd' + ProcessUtilities.executioner(command) + + return 1 + + def installPureFTPDConfigurations(self, mysqlPassword): + try: + ## setup ssl for ftp + + try: + os.mkdir("/etc/ssl/private") + except: + pass + + if (ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8) or ( + ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20 and ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu): + command = 'openssl req -newkey rsa:1024 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem' + else: + command = 'openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem' + + ProcessUtilities.executioner(command) + + import shutil + + ftpdPath = "/etc/pure-ftpd" + + if os.path.exists(ftpdPath): + shutil.rmtree(ftpdPath) + shutil.copytree("/usr/local/CyberCP/install/pure-ftpd-one", ftpdPath) + + else: + shutil.copytree("/usr/local/CyberCP/install/pure-ftpd-one", ftpdPath) + + + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + try: + os.mkdir('/etc/pure-ftpd/conf') + os.mkdir('/etc/pure-ftpd/auth') + os.mkdir('/etc/pure-ftpd/db') + except OSError as err: + pass + + data = open(ftpdPath + "/pureftpd-mysql.conf", "r").readlines() + + writeDataToFile = open(ftpdPath + "/pureftpd-mysql.conf", "w") + + dataWritten = "MYSQLPassword " + mysqlPassword + '\n' + for items in data: + if items.find("MYSQLPassword") > -1: + writeDataToFile.writelines(dataWritten) + else: + writeDataToFile.writelines(items) + + writeDataToFile.close() + + ftpConfPath = '/etc/pure-ftpd/pureftpd-mysql.conf' + + if self.remotemysql == 'ON': + command = "sed -i 's|localhost|%s|g' %s" % (self.mysqlhost, ftpConfPath) + ProcessUtilities.executioner(command) + + command = "sed -i 's|3306|%s|g' %s" % (self.mysqlport, ftpConfPath) + ProcessUtilities.executioner(command) + + command = "sed -i 's|MYSQLSocket /var/lib/mysql/mysql.sock||g' %s" % (ftpConfPath) + ProcessUtilities.executioner(command) + + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + + if os.path.exists('/etc/pure-ftpd/db/mysql.conf'): + os.remove('/etc/pure-ftpd/db/mysql.conf') + shutil.copy(ftpdPath + "/pureftpd-mysql.conf", '/etc/pure-ftpd/db/mysql.conf') + else: + shutil.copy(ftpdPath + "/pureftpd-mysql.conf", '/etc/pure-ftpd/db/mysql.conf') + + import subprocess + command = 'echo 1 > /etc/pure-ftpd/conf/TLS' + subprocess.call(command, shell=True) + + 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' + ProcessUtilities.executioner(command) + + command = 'ln -s /etc/pure-ftpd/conf/UnixAuthentication /etc/pure-ftpd/auth/65unix' + ProcessUtilities.executioner(command) + + command = 'systemctl restart pure-ftpd-mysql.service' + ProcessUtilities.executioner(command) + + return 1 + + except IOError as msg: + return 0 + + def ResetFTPConfigurations(self): + try: + ### Check if remote or local mysql + + passFile = "/etc/cyberpanel/mysqlPassword" + + try: + jsonData = json.loads(ProcessUtilities.outputExecutioner('cat %s' % (passFile))) + + self.mysqluser = jsonData['mysqluser'] + self.mysqlpassword = jsonData['mysqlpassword'] + self.mysqlport = jsonData['mysqlport'] + self.mysqlhost = jsonData['mysqlhost'] + self.remotemysql = 'ON' + + if self.mysqlhost.find('rds.amazon') > -1: + self.RDS = 1 + + ## Also set localhost to this server + + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddressLocal = ipData.split('\n', 1)[0] + + self.LOCALHOST = ipAddressLocal + except BaseException as msg: + self.remotemysql = 'OFF' + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile('%s. [setupConnection:75]' % (str(msg))) + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Removing and re-installing FTP..,5') + + if self.installPureFTPD() == 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], + 'installPureFTPD failed. [404].') + return 0 + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Resetting configurations..,40') + + import sys + sys.path.append('/usr/local/CyberCP') + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") + from CyberCP import settings + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Configurations reset..,70') + + if self.installPureFTPDConfigurations(settings.DATABASES['default']['PASSWORD']) == 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'installPureFTPDConfigurations failed. [404].') + return 0 + + if self.startPureFTPD() == 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], + 'startPureFTPD failed. [404].') + return 0 + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Fixing permissions..,90') + + from mailServer.mailserverManager import MailServerManager + MailServerManager(None, None, None).fixCyberPanelPermissions() + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') + + except BaseException as msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + +def main(): + + parser = argparse.ArgumentParser(description='CyberPanel') + parser.add_argument('function', help='Specify a function to call!') + parser.add_argument('--tempStatusPath', help='Path of temporary status file.') + + args = parser.parse_args() + + if args.function == "ResetFTPConfigurations": + extraArgs = {'tempStatusPath': args.tempStatusPath} + ftp = FTPManager(None, extraArgs) + ftp.ResetFTPConfigurations() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/install/install.py b/install/install.py index 39f018063..e784a1d05 100755 --- a/install/install.py +++ b/install/install.py @@ -1049,12 +1049,12 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; ###############Getting SSL - command = 'openssl req -newkey rsa:1024 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/postfix/key.pem -out /etc/postfix/cert.pem' + command = 'openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/postfix/key.pem -out /etc/postfix/cert.pem' preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) ## - command = 'openssl req -newkey rsa:1024 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/dovecot/key.pem -out /etc/dovecot/cert.pem' + command = 'openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/dovecot/key.pem -out /etc/dovecot/cert.pem' preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) # Cleanup config files for ubuntu diff --git a/mailServer/mailserverManager.py b/mailServer/mailserverManager.py index a67006543..3b9231b66 100755 --- a/mailServer/mailserverManager.py +++ b/mailServer/mailserverManager.py @@ -8,30 +8,51 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() from django.shortcuts import render,redirect from django.http import HttpResponse -from .models import Domains,EUsers -from loginSystem.views import loadLoginPage +try: + from .models import Domains,EUsers + from loginSystem.views import loadLoginPage +except: + pass import plogical.CyberCPLogFileWriter as logging import json import shlex import subprocess -from plogical.virtualHostUtilities import virtualHostUtilities -from plogical.mailUtilities import mailUtilities +try: + from plogical.virtualHostUtilities import virtualHostUtilities + from plogical.mailUtilities import mailUtilities +except: + pass import _thread -from dns.models import Domains as dnsDomains -from dns.models import Records as dnsRecords -from mailServer.models import Forwardings, Pipeprograms -from plogical.acl import ACLManager +try: + from dns.models import Domains as dnsDomains + from dns.models import Records as dnsRecords + from mailServer.models import Forwardings, Pipeprograms + from plogical.acl import ACLManager + from plogical.dnsUtilities import DNS + from loginSystem.models import Administrator + from websiteFunctions.models import Websites +except: + pass import os -from plogical.dnsUtilities import DNS -from loginSystem.models import Administrator from plogical.processUtilities import ProcessUtilities import bcrypt -from websiteFunctions.models import Websites +import threading as multi +import argparse -class MailServerManager: +class MailServerManager(multi.Thread): - def __init__(self, request = None): + def __init__(self, request = None, function = None, extraArgs = None): + multi.Thread.__init__(self) self.request = request + self.function = function + self.extraArgs = extraArgs + + def run(self): + try: + if self.function == 'RunServerLevelEmailChecks': + self.RunServerLevelEmailChecks() + except BaseException as msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg) + ' [MailServerManager.run]') def loadEmailHome(self): try: @@ -40,6 +61,7 @@ class MailServerManager: except KeyError: return redirect(loadLoginPage) + def createEmailAccount(self): try: userID = self.request.session['userID'] @@ -59,7 +81,6 @@ class MailServerManager: except BaseException as msg: return redirect(loadLoginPage) - def listEmails(self): try: userID = self.request.session['userID'] @@ -226,14 +247,18 @@ class MailServerManager: json_data = json.dumps(data_ret) return HttpResponse(json_data) - def fixMailSSL(self): + def fixMailSSL(self, data = None): try: userID = self.request.session['userID'] currentACL = ACLManager.loadedACL(userID) - data = json.loads(self.request.body) - selectedDomain = data['selectedDomain'] + if data == None: + data = json.loads(self.request.body) + selectedDomain = data['selectedDomain'] + else: + selectedDomain = data['websiteName'] + admin = Administrator.objects.get(pk=userID) @@ -818,3 +843,765 @@ class MailServerManager: final_json = json.dumps(final_dic) return HttpResponse(final_json) + ####### + + def checkIfMailServerSSLIssued(self): + postfixPath = '/etc/postfix/main.cf' + + postFixData = ProcessUtilities.outputExecutioner('cat %s' % (postfixPath)) + + if postFixData.find('myhostname = server.example.com') > -1: + return 0 + else: + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddress = ipData.split('\n', 1)[0] + + command = 'openssl s_client -connect %s:465' % (ipAddress) + result = ProcessUtilities.outputExecutioner(command) + + if result.find('18 (self signed certificate)') > -1: + return 0 + else: + return 1 + + def RunServerLevelEmailChecks(self): + try: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Checking if MailServer SSL issued..,10') + + reportFile = self.extraArgs['reportFile'] + + report = {} + report['MailSSL'] = self.checkIfMailServerSSLIssued() + + writeToFile = open(reportFile, 'w') + writeToFile.write(json.dumps(report)) + writeToFile.close() + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') + + except BaseException as msg: + final_dic = {'installOpenDKIM': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def install_postfix_davecot(self): + try: + if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + command = 'yum remove postfix -y' + ProcessUtilities.executioner(command) + elif ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + command = 'apt-get -y remove postfix' + ProcessUtilities.executioner(command) + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Re-installing postfix..,10') + + if ProcessUtilities.decideDistro() == ProcessUtilities.centos: + command = 'yum install --enablerepo=gf-plus -y postfix3 postfix3-ldap postfix3-mysql postfix3-pcre' + elif ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + + command = 'dnf --nogpg install -y https://mirror.ghettoforge.org/distributions/gf/el/8/gf/x86_64/gf-release-8-11.gf.el8.noarch.rpm' + ProcessUtilities.executioner(command) + + command = 'dnf install --enablerepo=gf-plus postfix3 postfix3-mysql -y' + else: + import socket + command = 'apt-get -y debconf-utils' + ProcessUtilities.executioner(command) + file_name = 'pf.unattend.text' + pf = open(file_name, 'w') + pf.write('postfix postfix/mailname string ' + str(socket.getfqdn() + '\n')) + pf.write('postfix postfix/main_mailer_type string "Internet Site"\n') + pf.close() + command = 'debconf-set-selections ' + file_name + ProcessUtilities.executioner(command) + + command = 'apt-get -y install postfix' + # os.remove(file_name) + + ProcessUtilities.executioner(command) + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Re-installing Dovecot..,15') + + if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + pass + else: + command = 'apt-get -y install dovecot-imapd dovecot-pop3d postfix-mysql' + + ProcessUtilities.executioner(command) + + ## + + if ProcessUtilities.decideDistro() == ProcessUtilities.centos: + command = 'yum --enablerepo=gf-plus -y install dovecot23 dovecot23-mysql' + elif ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + command = 'dnf install --enablerepo=gf-plus dovecot23 dovecot23-mysql -y' + else: + command = 'apt-get -y install dovecot-mysql' + + ProcessUtilities.executioner(command) + + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + + command = 'curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import' + subprocess.call(command, shell=True) + + command = 'gpg --export ED409DA1 > /etc/apt/trusted.gpg.d/dovecot.gpg' + subprocess.call(command, shell=True) + + debPath = '/etc/apt/sources.list.d/dovecot.list' + writeToFile = open(debPath, 'w') + writeToFile.write('deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/bionic bionic main\n') + writeToFile.close() + + try: + command = 'apt update -y' + subprocess.call(command, shell=True) + except: + pass + + try: + command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' + subprocess.call(command, shell=True) + + command = 'dpkg --configure -a' + subprocess.call(command, shell=True) + + command = 'apt --fix-broken install -y' + subprocess.call(command, shell=True) + + command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' + subprocess.call(command, shell=True) + except: + pass + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Postfix/dovecot reinstalled.,40') + + except BaseException as msg: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], '%s [install_postfix_davecot][404]' % (str(msg)), 10) + return 0 + + return 1 + + def setup_email_Passwords(self, mysqlPassword): + try: + + + mysql_virtual_domains = "/usr/local/CyberCP/install/email-configs-one/mysql-virtual_domains.cf" + mysql_virtual_forwardings = "/usr/local/CyberCP/install/email-configs-one/mysql-virtual_forwardings.cf" + mysql_virtual_mailboxes = "/usr/local/CyberCP/install/email-configs-one/mysql-virtual_mailboxes.cf" + mysql_virtual_email2email = "/usr/local/CyberCP/install/email-configs-one/mysql-virtual_email2email.cf" + davecotmysql = "/usr/local/CyberCP/install/email-configs-one/dovecot-sql.conf.ext" + + ### update password: + + data = open(davecotmysql, "r").readlines() + + writeDataToFile = open(davecotmysql, "w") + + dataWritten = "connect = host=localhost dbname=cyberpanel user=cyberpanel password=" + mysqlPassword + " port=3306\n" + + for items in data: + if items.find("connect") > -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 password: + + data = open(mysql_virtual_domains, "r").readlines() + + writeDataToFile = open(mysql_virtual_domains, "w") + + dataWritten = "password = " + mysqlPassword + "\n" + + for items in data: + if items.find("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 password: + + data = open(mysql_virtual_forwardings, "r").readlines() + + writeDataToFile = open(mysql_virtual_forwardings, "w") + + dataWritten = "password = " + mysqlPassword + "\n" + + for items in data: + if items.find("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 password: + + data = open(mysql_virtual_mailboxes, "r").readlines() + + writeDataToFile = open(mysql_virtual_mailboxes, "w") + + dataWritten = "password = " + mysqlPassword + "\n" + + for items in data: + if items.find("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 password: + + data = open(mysql_virtual_email2email, "r").readlines() + + writeDataToFile = open(mysql_virtual_email2email, "w") + + dataWritten = "password = " + mysqlPassword + "\n" + + for items in data: + if items.find("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() + + if self.remotemysql == 'ON': + command = "sed -i 's|host=localhost|host=%s|g' %s" % (self.mysqlhost, davecotmysql) + ProcessUtilities.executioner(command) + + command = "sed -i 's|port=3306|port=%s|g' %s" % (self.mysqlport, davecotmysql) + ProcessUtilities.executioner(command) + + ## + + command = "sed -i 's|localhost|%s:%s|g' %s" % (self.mysqlhost, self.mysqlport, mysql_virtual_domains) + ProcessUtilities.executioner(command) + + command = "sed -i 's|localhost|%s:%s|g' %s" % ( + self.mysqlhost, self.mysqlport, mysql_virtual_forwardings) + ProcessUtilities.executioner(command) + + command = "sed -i 's|localhost|%s:%s|g' %s" % ( + self.mysqlhost, self.mysqlport, mysql_virtual_mailboxes) + ProcessUtilities.executioner(command) + + command = "sed -i 's|localhost|%s:%s|g' %s" % ( + self.mysqlhost, self.mysqlport, mysql_virtual_email2email) + ProcessUtilities.executioner(command) + except BaseException as msg: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], + '%s [setup_email_Passwords][404]' % (str(msg)), 10) + return 0 + + return 1 + + def centos_lib_dir_to_ubuntu(self, filename, old, new): + try: + fd = open(filename, 'r') + lines = fd.readlines() + fd.close() + fd = open(filename, 'w') + centos_prefix = old + ubuntu_prefix = new + for line in lines: + index = line.find(centos_prefix) + if index != -1: + line = line[:index] + ubuntu_prefix + line[index + len(centos_prefix):] + fd.write(line) + fd.close() + except BaseException as msg: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], + '%s [centos_lib_dir_to_ubuntu][404]' % (str(msg)), 10) + + def setup_postfix_davecot_config(self): + try: + + mysql_virtual_domains = "/etc/postfix/mysql-virtual_domains.cf" + mysql_virtual_forwardings = "/etc/postfix/mysql-virtual_forwardings.cf" + mysql_virtual_mailboxes = "/etc/postfix/mysql-virtual_mailboxes.cf" + mysql_virtual_email2email = "/etc/postfix/mysql-virtual_email2email.cf" + main = "/etc/postfix/main.cf" + master = "/etc/postfix/master.cf" + davecot = "/etc/dovecot/dovecot.conf" + davecotmysql = "/etc/dovecot/dovecot-sql.conf.ext" + + if os.path.exists(mysql_virtual_domains): + os.remove(mysql_virtual_domains) + + if os.path.exists(mysql_virtual_forwardings): + os.remove(mysql_virtual_forwardings) + + if os.path.exists(mysql_virtual_mailboxes): + os.remove(mysql_virtual_mailboxes) + + if os.path.exists(mysql_virtual_email2email): + os.remove(mysql_virtual_email2email) + + if os.path.exists(main): + os.remove(main) + + if os.path.exists(master): + os.remove(master) + + if os.path.exists(davecot): + os.remove(davecot) + + if os.path.exists(davecotmysql): + os.remove(davecotmysql) + + ###############Getting SSL + + command = 'openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/postfix/key.pem -out /etc/postfix/cert.pem' + ProcessUtilities.executioner(command) + + ## + + command = 'openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" -keyout /etc/dovecot/key.pem -out /etc/dovecot/cert.pem' + ProcessUtilities.executioner(command) + + # Cleanup config files for ubuntu + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + self.centos_lib_dir_to_ubuntu("/usr/local/CyberCP/install/email-configs-one/master.cf", "/usr/libexec/", "/usr/lib/") + self.centos_lib_dir_to_ubuntu("/usr/local/CyberCP/install/email-configs-one/main.cf", "/usr/libexec/postfix", + "/usr/lib/postfix/sbin") + + + ########### Copy config files + import shutil + + shutil.copy("/usr/local/CyberCP/install/email-configs-one/mysql-virtual_domains.cf", "/etc/postfix/mysql-virtual_domains.cf") + shutil.copy("/usr/local/CyberCP/install/email-configs-one/mysql-virtual_forwardings.cf", + "/etc/postfix/mysql-virtual_forwardings.cf") + shutil.copy("/usr/local/CyberCP/install/email-configs-one/mysql-virtual_mailboxes.cf", "/etc/postfix/mysql-virtual_mailboxes.cf") + shutil.copy("/usr/local/CyberCP/install/email-configs-one/mysql-virtual_email2email.cf", + "/etc/postfix/mysql-virtual_email2email.cf") + shutil.copy("/usr/local/CyberCP/install/email-configs-one/main.cf", main) + shutil.copy("/usr/local/CyberCP/install/email-configs-one/master.cf", master) + shutil.copy("/usr/local/CyberCP/install/email-configs-one/dovecot.conf", davecot) + shutil.copy("/usr/local/CyberCP/install/email-configs-one/dovecot-sql.conf.ext", davecotmysql) + + + ######################################## Permissions + + command = 'chmod o= /etc/postfix/mysql-virtual_domains.cf' + ProcessUtilities.executioner(command) + + ## + + command = 'chmod o= /etc/postfix/mysql-virtual_forwardings.cf' + ProcessUtilities.executioner(command) + + ## + + command = 'chmod o= /etc/postfix/mysql-virtual_mailboxes.cf' + ProcessUtilities.executioner(command) + + ## + + command = 'chmod o= /etc/postfix/mysql-virtual_email2email.cf' + ProcessUtilities.executioner(command) + + ## + + command = 'chmod o= ' + main + ProcessUtilities.executioner(command) + + ## + + command = 'chmod o= ' + master + ProcessUtilities.executioner(command) + + ####################################### + + command = 'chgrp postfix /etc/postfix/mysql-virtual_domains.cf' + ProcessUtilities.executioner(command) + + ## + + command = 'chgrp postfix /etc/postfix/mysql-virtual_forwardings.cf' + ProcessUtilities.executioner(command) + ## + + command = 'chgrp postfix /etc/postfix/mysql-virtual_mailboxes.cf' + ProcessUtilities.executioner(command) + + ## + + command = 'chgrp postfix /etc/postfix/mysql-virtual_email2email.cf' + ProcessUtilities.executioner(command) + + ## + + command = 'chgrp postfix ' + main + ProcessUtilities.executioner(command) + + ## + + command = 'chgrp postfix ' + master + ProcessUtilities.executioner(command) + + ######################################## users and groups + + command = 'groupadd -g 5000 vmail' + ProcessUtilities.executioner(command) + + ## + + command = 'useradd -g vmail -u 5000 vmail -d /home/vmail -m' + ProcessUtilities.executioner(command) + + ######################################## Further configurations + + # hostname = socket.gethostname() + + ################################### Restart postix + + command = 'systemctl enable postfix.service' + ProcessUtilities.executioner(command) + + ## + + command = 'systemctl start postfix.service' + ProcessUtilities.executioner(command) + + ######################################## Permissions + + command = 'chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext' + ProcessUtilities.executioner(command) + + ## + + command = 'chmod o= /etc/dovecot/dovecot-sql.conf.ext' + ProcessUtilities.executioner(command) + + ################################### Restart davecot + + command = 'systemctl enable dovecot.service' + ProcessUtilities.executioner(command) + + ## + + command = 'systemctl start dovecot.service' + ProcessUtilities.executioner(command) + + ## + + command = 'systemctl restart postfix.service' + ProcessUtilities.executioner(command) + + ## chaging permissions for main.cf + + command = "chmod 755 " + main + ProcessUtilities.executioner(command) + + if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + command = "mkdir -p /etc/pki/dovecot/private/" + ProcessUtilities.executioner(command) + + command = "mkdir -p /etc/pki/dovecot/certs/" + ProcessUtilities.executioner(command) + + command = "mkdir -p /etc/opendkim/keys/" + ProcessUtilities.executioner(command) + + command = "sed -i 's/auth_mechanisms = plain/#auth_mechanisms = plain/g' /etc/dovecot/conf.d/10-auth.conf" + ProcessUtilities.executioner(command) + + ## Ubuntu 18.10 ssl_dh for dovecot 2.3.2.1 + + if ProcessUtilities.ubuntu: + dovecotConf = '/etc/dovecot/dovecot.conf' + + data = open(dovecotConf, 'r').readlines() + writeToFile = open(dovecotConf, 'w') + for items in data: + if items.find('ssl_key = -1: + writeToFile.writelines(items) + writeToFile.writelines('ssl_dh = -1: + self.RDS = 1 + + ## Also set localhost to this server + + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddressLocal = ipData.split('\n', 1)[0] + + self.LOCALHOST = ipAddressLocal + + except BaseException as msg: + self.remotemysql = 'OFF' + + if os.path.exists(ProcessUtilities.debugPath): + logging.CyberCPLogFileWriter.writeToFile('%s. [setupConnection:75]' % (str(msg))) + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Removing and re-installing postfix/dovecot..,5') + + if self.install_postfix_davecot() == 0: + return 0 + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Resetting configurations..,40') + + import sys + sys.path.append('/usr/local/CyberCP') + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") + from CyberCP import settings + + if self.setup_email_Passwords(settings.DATABASES['default']['PASSWORD']) == 0: + return 0 + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Configurations reset..,70') + + if self.setup_postfix_davecot_config() == 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'setup_postfix_davecot_config failed. [404].') + return 0 + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Fixing permissions..,90') + + self.fixCyberPanelPermissions() + + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') + + except BaseException as msg: + final_dic = {'installOpenDKIM': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def debugEmailForSite(self, websiteName): + + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddress = ipData.split('\n', 1)[0] + + try: + import socket + siteIPAddr = socket.gethostbyname('mail.%s' % (websiteName)) + + if siteIPAddr != ipAddress: + return 0, 'mail.%s does not point to %s.' % (websiteName, ipAddress) + except: + return 0, 'mail.%s does not point to %s.' % (websiteName, ipAddress) + + command = 'openssl s_client -connect mail.%s:993' % (websiteName) + result = ProcessUtilities.outputExecutioner(command) + + if result.find('18 (self signed certificate)') > -1: + return 0, 'No valid SSL on port 993.' + else: + return 1, 'All checks are OK.' + +def main(): + + parser = argparse.ArgumentParser(description='CyberPanel') + parser.add_argument('function', help='Specifiy a function to call!') + parser.add_argument('--tempStatusPath', help='Path of temporary status file.') + + args = parser.parse_args() + + if args.function == "ResetEmailConfigurations": + extraArgs = {'tempStatusPath': args.tempStatusPath} + background = MailServerManager(None, 'ResetEmailConfigurations', extraArgs) + background.ResetEmailConfigurations() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/plogical/processUtilities.py b/plogical/processUtilities.py index 3e5b512cb..cff46e6c5 100755 --- a/plogical/processUtilities.py +++ b/plogical/processUtilities.py @@ -290,7 +290,6 @@ class ProcessUtilities(multi.Thread): def customPoen(self): try: - if type(self.extraArgs['command']) == str or type(self.extraArgs['command']) == bytes: command = self.extraArgs['command'] else: diff --git a/plogical/virtualHostUtilities.py b/plogical/virtualHostUtilities.py index 9c9a0c97b..8577a9116 100755 --- a/plogical/virtualHostUtilities.py +++ b/plogical/virtualHostUtilities.py @@ -64,9 +64,12 @@ class virtualHostUtilities: childDomain = 'mail.%s' % (virtualHostName) childPath = '/home/%s/public_html/%s' % (virtualHostName, childDomain) - virtualHostUtilities.createDomain(virtualHostName, childDomain, 'PHP 7.2', childPath, 1, 0, 0, + result = virtualHostUtilities.createDomain(virtualHostName, childDomain, 'PHP 7.2', childPath, 1, 0, 0, admin.userName, 0, "/home/cyberpanel/" + str(randint(1000, 9999))) + if result[0] == 0: + sslUtilities.issueSSLForDomain(virtualHostName, admin.email, childPath) + ## update dovecot conf to enable auto-discover dovecotPath = '/etc/dovecot/dovecot.conf' @@ -74,18 +77,18 @@ class virtualHostUtilities: if os.path.exists(dovecotPath): dovecotContent = open(dovecotPath, 'r').read() - if dovecotContent.find(childDomain) == -1: + if dovecotContent.find('/live/%s/' % (childDomain)) == -1: content = """\nlocal_name %s { - ssl_cert =