HEX
Server: LiteSpeed
System: Linux php-prod-1.spaceapp.ru 5.15.0-157-generic #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 x86_64
User: xnsbb3110 (1041)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //usr/local/CyberCP/plogical/dnsUtilities.py
#!/usr/local/CyberCP/bin/python
import os, sys

sys.path.append('/usr/local/CyberCP')
import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
try:
    django.setup()
except:
    pass
from plogical import CyberCPLogFileWriter as logging
import subprocess
import shlex

try:
    from dns.models import Domains, Records
    from manageServices.models import PDNSStatus, SlaveServers
except:
    pass

import CloudFlare
from plogical.processUtilities import ProcessUtilities


class DNS:
    nsd_base = "/etc/nsd/nsd.conf"
    zones_base_dir = "/usr/local/lsws/conf/zones/"
    create_zone_dir = "/usr/local/lsws/conf/zones"
    defaultNameServersPath = '/home/cyberpanel/defaultNameservers'
    CFPath = '/home/cyberpanel/CloudFlare'

    ## DNS Functions

    def loadCFKeys(self):
        cfFile = '%s%s' % (DNS.CFPath, self.admin.userName)

        if os.path.exists(cfFile):
            data = open(cfFile, 'r').readlines()
            self.email = data[0].rstrip('\n')
            self.key = data[1].rstrip('\n')
            self.status = data[2].rstrip('\n')
            return 1
        else:
            #logging.CyberCPLogFileWriter.writeToFile('User %s does not have CloudFlare configured.' % (self.admin.userName))
            return 0

    def cfTemplate(self, zoneDomain, admin, enableCheck=None):
        try:
            self.admin = admin
            ## Get zone

            if self.loadCFKeys():

                if enableCheck == None:
                    pass
                else:
                    if self.status == 'Enable':
                        pass
                    else:
                        return 0, 'Sync not enabled.'

                cf = CloudFlare.CloudFlare(email=self.email, token=self.key)

                try:
                    params = {'name': zoneDomain, 'per_page': 50}
                    zones = cf.zones.get(params=params)

                    for zone in sorted(zones, key=lambda v: v['name']):
                        zone = zone['id']

                        domain = Domains.objects.get(name=zoneDomain)
                        records = Records.objects.filter(domain_id=domain.id)

                        for record in records:
                            DNS.createDNSRecordCloudFlare(cf, zone, record.name, record.type, record.content, record.prio,
                                                          record.ttl)

                        return 1, None


                except CloudFlare.exceptions.CloudFlareAPIError as e:
                    logging.CyberCPLogFileWriter.writeToFile(str(e))
                except Exception as e:
                    logging.CyberCPLogFileWriter.writeToFile(str(e))

                try:
                    zone_info = cf.zones.post(data={'jump_start': False, 'name': zoneDomain})

                    zone = zone_info['id']

                    domain = Domains.objects.get(name=zoneDomain)
                    records = Records.objects.filter(domain_id=domain.id)

                    for record in records:
                        DNS.createDNSRecordCloudFlare(cf, zone, record.name, record.type, record.content, record.prio,
                                                      record.ttl)

                    return 1, None

                except CloudFlare.exceptions.CloudFlareAPIError as e:
                    return 0, str(e)
                except Exception as e:
                    return 0, str(e)

        except BaseException as msg:
            return 0, str(e)

    @staticmethod
    def dnsTemplate(domain, admin):
        try:

            ipFile = "/etc/cyberpanel/machineIP"
            f = open(ipFile)
            ipData = f.read()
            ipAddress = ipData.split('\n', 1)[0]


            import tldextract

            no_cache_extract = tldextract.TLDExtract(cache_dir=None)

            extractDomain = no_cache_extract(domain)
            topLevelDomain = extractDomain.domain + '.' + extractDomain.suffix
            subDomain = extractDomain.subdomain

            if len(subDomain) == 0:
                if Domains.objects.filter(name=topLevelDomain).count() == 0:
                    try:
                        pdns = PDNSStatus.objects.get(pk=1)
                        if pdns.type == 'MASTER':
                            zone = Domains(admin=admin, name=topLevelDomain, type="MASTER")
                            zone.save()

                            for items in SlaveServers.objects.all():
                                record = Records(domainOwner=zone,
                                                 domain_id=zone.id,
                                                 name=topLevelDomain,
                                                 type="NS",
                                                 content=items.slaveServer,
                                                 ttl=3600,
                                                 prio=0,
                                                 disabled=0,
                                                 auth=1)
                                record.save()
                        else:
                            zone = Domains(admin=admin, name=topLevelDomain, type="NATIVE")
                    except:
                        zone = Domains(admin=admin, name=topLevelDomain, type="NATIVE")

                    zone.save()

                    if zone.type == 'NATIVE':

                        if os.path.exists(DNS.defaultNameServersPath):
                            defaultNS = open(DNS.defaultNameServersPath, 'r').readlines()

                            for items in defaultNS:
                                if len(items) > 5:
                                    record = Records(domainOwner=zone,
                                                     domain_id=zone.id,
                                                     name=topLevelDomain,
                                                     type="NS",
                                                     content=items.rstrip('\n'),
                                                     ttl=3600,
                                                     prio=0,
                                                     disabled=0,
                                                     auth=1)
                                    record.save()
                        else:
                            record = Records(domainOwner=zone,
                                             domain_id=zone.id,
                                             name=topLevelDomain,
                                             type="NS",
                                             content='ns1.%s' % (topLevelDomain),
                                             ttl=3600,
                                             prio=0,
                                             disabled=0,
                                             auth=1)
                            record.save()

                            record = Records(domainOwner=zone,
                                             domain_id=zone.id,
                                             name=topLevelDomain,
                                             type="NS",
                                             content='ns2.%s' % (topLevelDomain),
                                             ttl=3600,
                                             prio=0,
                                             disabled=0,
                                             auth=1)
                            record.save()

                    content = "ns1." + topLevelDomain + " hostmaster." + topLevelDomain + " 1 10800 3600 1209600 3600"

                    # soaRecord = Records(domainOwner=zone,
                    #                     domain_id=zone.id,
                    #                     name=topLevelDomain,
                    #                     type="SOA",
                    #                     content=content,
                    #                     ttl=3600,
                    #                     prio=0,
                    #                     disabled=0,
                    #                     auth=1)
                    # soaRecord.save()

                    DNS.createDNSRecord(zone, topLevelDomain, "SOA", content, 0, 3600)

                    ## Main A record.

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=topLevelDomain,
                    #                  type="A",
                    #                  content=ipAddress,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, topLevelDomain, "A", ipAddress, 0, 3600)

                    # CNAME Records.

                    cNameValue = "www." + topLevelDomain

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=cNameValue,
                    #                  type="CNAME",
                    #                  content=topLevelDomain,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, cNameValue, "CNAME", topLevelDomain, 0, 3600)

                    cNameValue = "ftp." + topLevelDomain

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=cNameValue,
                    #                  type="CNAME",
                    #                  content=topLevelDomain,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, cNameValue, "CNAME", topLevelDomain, 0, 3600)

                    ## MX Record.

                    mxValue = topLevelDomain

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=topLevelDomain,
                    #                  type="MX",
                    #                  content=mxValue,
                    #                  ttl=3600,
                    #                  prio="10",
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, topLevelDomain, "MX", mxValue, 10, 3600)

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=mxValue,
                    #                  type="A",
                    #                  content=ipAddress,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, mxValue, "A", ipAddress, 0, 3600)

                    ## TXT Records for mail

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=topLevelDomain,
                    #                  type="TXT",
                    #                  content="v=spf1 a mx ip4:" + ipAddress + " ~all",
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, topLevelDomain, "TXT", "v=spf1 a mx ip4:" + ipAddress + " ~all", 0, 3600)

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name="_dmarc." + topLevelDomain,
                    #                  type="TXT",
                    #                  content="v=DMARC1; p=none",
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, "_dmarc." + topLevelDomain, "TXT", "v=DMARC1; p=none;", 0, 3600)

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name="_domainkey." + topLevelDomain,
                    #                  type="TXT",
                    #                  content="t=y; o=~;",
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, "_domainkey." + topLevelDomain, "TXT", "t=y; o=~;", 0, 3600)
            else:
                if Domains.objects.filter(name=topLevelDomain).count() == 0:
                    try:
                        pdns = PDNSStatus.objects.get(pk=1)
                        if pdns.type == 'MASTER':
                            zone = Domains(admin=admin, name=topLevelDomain, type="MASTER")
                        else:
                            zone = Domains(admin=admin, name=topLevelDomain, type="NATIVE")
                    except:
                        zone = Domains(admin=admin, name=topLevelDomain, type="NATIVE")

                    zone.save()

                    content = "ns1." + topLevelDomain + " hostmaster." + topLevelDomain + " 1 10800 3600 1209600 3600"

                    # soaRecord = Records(domainOwner=zone,
                    #                     domain_id=zone.id,
                    #                     name=topLevelDomain,
                    #                     type="SOA",
                    #                     content=content,
                    #                     ttl=3600,
                    #                     prio=0,
                    #                     disabled=0,
                    #                     auth=1)
                    # soaRecord.save()

                    DNS.createDNSRecord(zone, topLevelDomain, "SOA", content, 0, 3600)

                    ## Main A record.

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=topLevelDomain,
                    #                  type="A",
                    #                  content=ipAddress,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, topLevelDomain, "A", ipAddress, 0, 3600)

                    # CNAME Records.

                    cNameValue = "www." + topLevelDomain

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=cNameValue,
                    #                  type="CNAME",
                    #                  content=topLevelDomain,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, cNameValue, "CNAME", topLevelDomain, 0, 3600)

                    cNameValue = "ftp." + topLevelDomain

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=cNameValue,
                    #                  type="CNAME",
                    #                  content=topLevelDomain,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, cNameValue, "CNAME", topLevelDomain, 0, 3600)

                    ## MX Record.

                    mxValue = topLevelDomain

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=topLevelDomain,
                    #                  type="MX",
                    #                  content=mxValue,
                    #                  ttl=3600,
                    #                  prio="10",
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, mxValue, "MX", mxValue, 10, 3600)

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=mxValue,
                    #                  type="A",
                    #                  content=ipAddress,
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, mxValue, "A", ipAddress, 0, 3600)

                    ## TXT Records for mail

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name=topLevelDomain,
                    #                  type="TXT",
                    #                  content="v=spf1 a mx ip4:" + ipAddress + " ~all",
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, topLevelDomain, "TXT", "v=spf1 a mx ip4:" + ipAddress + " ~all", 0, 3600)

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name="_dmarc." + topLevelDomain,
                    #                  type="TXT",
                    #                  content="v=DMARC1; p=none",
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, "_dmarc." + topLevelDomain, "TXT", "v=DMARC1; p=none;", 0, 3600)

                    # record = Records(domainOwner=zone,
                    #                  domain_id=zone.id,
                    #                  name="_domainkey." + topLevelDomain,
                    #                  type="TXT",
                    #                  content="t=y; o=~;",
                    #                  ttl=3600,
                    #                  prio=0,
                    #                  disabled=0,
                    #                  auth=1)
                    # record.save()

                    DNS.createDNSRecord(zone, "_domainkey." + topLevelDomain, "TXT", "t=y; o=~;", 0, 3600)

                ## Creating sub-domain level record.

                zone = Domains.objects.get(name=topLevelDomain)

                actualSubDomain = subDomain + "." + topLevelDomain

                ## Main A record.

                DNS.createDNSRecord(zone, actualSubDomain, "A", ipAddress, 0, 3600)

                ## Mail Record

                if ('mail.%s' % (actualSubDomain)).find('mail.mail') == -1:
                    DNS.createDNSRecord(zone, 'mail.' + actualSubDomain, "A", ipAddress, 0, 3600)

                # CNAME Records.

                cNameValue = "www." + actualSubDomain

                DNS.createDNSRecord(zone, cNameValue, "CNAME", actualSubDomain, 0, 3600)

                ## MX Records

                mxValue = actualSubDomain

                # record = Records(domainOwner=zone,
                #                  domain_id=zone.id,
                #                  name=actualSubDomain,
                #                  type="MX",
                #                  content=mxValue,
                #                  ttl=3600,
                #                  prio="10",
                #                  disabled=0,
                #                  auth=1)
                # record.save()

                DNS.createDNSRecord(zone, actualSubDomain, "MX", mxValue, 10, 3600)

                ## TXT Records

                # record = Records(domainOwner=zone,
                #                  domain_id=zone.id,
                #                  name=actualSubDomain,
                #                  type="TXT",
                #                  content="v=spf1 a mx ip4:" + ipAddress + " ~all",
                #                  ttl=3600,
                #                  prio=0,
                #                  disabled=0,
                #                  auth=1)
                # record.save()

                DNS.createDNSRecord(zone, actualSubDomain, "TXT", "v=spf1 a mx ip4:" + ipAddress + " ~all", 0, 3600)

                # record = Records(domainOwner=zone,
                #                  domain_id=zone.id,
                #                  name="_dmarc." + actualSubDomain,
                #                  type="TXT",
                #                  content="v=DMARC1; p=none",
                #                  ttl=3600,
                #                  prio=0,
                #                  disabled=0,
                #                  auth=1)
                # record.save()

                DNS.createDNSRecord(zone, "_dmarc." + actualSubDomain, "TXT", "v=DMARC1; p=none;", 0, 3600)

                # record = Records(domainOwner=zone,
                #                  domain_id=zone.id,
                #                  name="_domainkey." + actualSubDomain,
                #                  type="TXT",
                #                  content="t=y; o=~;",
                #                  ttl=3600,
                #                  prio=0,
                #                  disabled=0,
                #                  auth=1)
                # record.save()

                DNS.createDNSRecord(zone, "_domainkey." + actualSubDomain, "TXT", "t=y; o=~;", 0, 3600)

            if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
                command = 'sudo systemctl restart pdns'
                ProcessUtilities.executioner(command)

            dns = DNS()
            dns.cfTemplate(domain, admin)

        except BaseException as msg:
            logging.CyberCPLogFileWriter.writeToFile(
                "We had errors while creating DNS records for: " + domain + ". Error message: " + str(msg))

    @staticmethod
    def createDKIMRecords(domain):
        try:

            import tldextract

            no_cache_extract = tldextract.TLDExtract(cache_dir=None)

            extractDomain = no_cache_extract(domain)
            topLevelDomain = extractDomain.domain + '.' + extractDomain.suffix
            subDomain = extractDomain.subdomain

            zone = Domains.objects.get(name=topLevelDomain)

            path = "/etc/opendkim/keys/" + topLevelDomain + "/default.txt"
            command = "cat " + path
            output = subprocess.check_output(shlex.split(command)).decode("utf-8")
            leftIndex = output.index('(') + 2
            rightIndex = output.rindex(')') - 1

            if Records.objects.filter(domainOwner=zone, name="default._domainkey." + topLevelDomain).count() == 0:

                record = Records(domainOwner=zone,
                                 domain_id=zone.id,
                                 name="default._domainkey." + topLevelDomain,
                                 type="TXT",
                                 content=output[leftIndex:rightIndex],
                                 ttl=3600,
                                 prio=0,
                                 disabled=0,
                                 auth=1)
                record.save()
            #### in else we need to update record if new key found
            else:
                rcrd = Records.objects.get(domainOwner=zone, name="default._domainkey." + topLevelDomain)
                rcrd.content =  output[leftIndex:rightIndex]
                rcrd.save()


            if len(subDomain) > 0:
                if Records.objects.filter(domainOwner=zone, name="default._domainkey." + domain).count() == 0:
                    record = Records(domainOwner=zone,
                                     domain_id=zone.id,
                                     name="default._domainkey." + domain,
                                     type="TXT",
                                     content=output[leftIndex:rightIndex],
                                     ttl=3600,
                                     prio=0,
                                     disabled=0,
                                     auth=1)
                    record.save()
                #### in else we need to update record of new key found
                else:
                    rcrd = Records.objects.get(domainOwner=zone, name="default._domainkey." + domain)
                    rcrd.content = output[leftIndex:rightIndex]
                    rcrd.save()

            if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
                command = ' systemctl restart pdns'
                ProcessUtilities.executioner(command)

            ## Add record to CF If sync enabled

            dns = DNS()
            dns.admin = zone.admin
            if dns.loadCFKeys():
                cf = CloudFlare.CloudFlare(email=dns.email, token=dns.key)

                if dns.status == 'Enable':
                    try:
                        params = {'name': domain, 'per_page': 50}
                        zones = cf.zones.get(params=params)

                        for zone in sorted(zones, key=lambda v: v['name']):
                            zone = zone['id']

                            DNS.createDNSRecordCloudFlare(cf, zone, "default._domainkey." + topLevelDomain, 'TXT',
                                                          output[leftIndex:rightIndex], 0,
                                                          3600)


                    except CloudFlare.exceptions.CloudFlareAPIError as e:
                        logging.CyberCPLogFileWriter.writeToFile(str(e))
                    except Exception as e:
                        logging.CyberCPLogFileWriter.writeToFile(str(e))

        except BaseException as msg:
            logging.CyberCPLogFileWriter.writeToFile(
                "We had errors while creating DKIM record for: " + domain + ". Error message: " + str(msg))

    @staticmethod
    def getZoneObject(virtualHostName):
        try:
            return Domains.objects.get(name=virtualHostName)
        except:
            return 0

    @staticmethod
    def createDNSRecordCloudFlare(cf, zone, name, type, value, priority, ttl):
        try:

            if value.find('DKIM') > -1:
                value = value.replace('\n\t', '')
                value = value.replace('"', '')

            if ttl > 0:
                dns_record = {'name': name, 'type': type, 'content': value, 'ttl': ttl, 'priority': priority}
            else:
                dns_record = {'name': name, 'type': type, 'content': value, 'priority': priority}

            cf.zones.dns_records.post(zone, data=dns_record)
        except BaseException as msg:
            logging.CyberCPLogFileWriter.writeToFile(str(msg) + '. [createDNSRecordCloudFlare]')

    @staticmethod
    def createDNSRecord(zone, name, type, value, priority, ttl):
        try:

            if Records.objects.filter(name=name, type=type, content=value).count() > 0:
                return

            if zone.type == 'MASTER':
                try:
                    for getSOA in Records.objects.filter(domainOwner=zone, type='SOA'):
                    #getSOA = Records.objects.get(domainOwner=zone, type='SOA')
                        soaContent = getSOA.content.split(' ')
                        soaContent[2] = str(int(soaContent[2]) + 1)
                        getSOA.content = " ".join(soaContent)
                        getSOA.save()
                except:
                    pass


            if type == 'NS':
                if Records.objects.filter(name=name, type=type, content=value).count() == 0:
                    record = Records(domainOwner=zone,
                                     domain_id=zone.id,
                                     name=name,
                                     type=type,
                                     content=value,
                                     ttl=ttl,
                                     prio=priority,
                                     disabled=0,
                                     auth=1)
                    record.save()

                    if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
                        command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service'
                        result = ProcessUtilities.outputExecutioner(command)

                        if result.find('No such file') == -1:
                            command = 'sudo systemctl restart pdns'
                            ProcessUtilities.executioner(command)

                return

            if type == 'SOA':
                if Records.objects.filter(name=name, type=type, content=value).count() == 0:
                    record = Records(domainOwner=zone,
                                     domain_id=zone.id,
                                     name=name,
                                     type=type,
                                     content=value,
                                     ttl=ttl,
                                     prio=priority,
                                     disabled=0,
                                     auth=1)
                    record.save()

                    if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
                        command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service'
                        result = ProcessUtilities.outputExecutioner(command)

                        if result.find('No such file') == -1:
                            command = 'sudo systemctl restart pdns'
                            ProcessUtilities.executioner(command)

                return

            if type == 'TXT':
                if Records.objects.filter(name=name, type=type, content=value).count() == 0:
                    record = Records(domainOwner=zone,
                                     domain_id=zone.id,
                                     name=name,
                                     type=type,
                                     content=value,
                                     ttl=ttl,
                                     prio=priority,
                                     disabled=0,
                                     auth=1)
                    record.save()

                    if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
                        command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service'
                        result = ProcessUtilities.outputExecutioner(command)

                        if result.find('No such file') == -1:
                            command = 'sudo systemctl restart pdns'
                            ProcessUtilities.executioner(command)
                return

            if type == 'MX':
                record = Records(domainOwner=zone,
                                 domain_id=zone.id,
                                 name=name,
                                 type=type,
                                 content=value,
                                 ttl=ttl,
                                 prio=str(priority),
                                 disabled=0,
                                 auth=1)
                record.save()

                if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
                    command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service'
                    result = ProcessUtilities.outputExecutioner(command)

                    if result.find('No such file') == -1:
                        command = 'sudo systemctl restart pdns'
                        ProcessUtilities.executioner(command)
                return

            if Records.objects.filter(name=name, type=type).count() == 0:
                record = Records(domainOwner=zone,
                                 domain_id=zone.id,
                                 name=name,
                                 type=type,
                                 content=value,
                                 ttl=ttl,
                                 prio=priority,
                                 disabled=0,
                                 auth=1)
                record.save()
                if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:

                    command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service'
                    result = ProcessUtilities.outputExecutioner(command)

                    if result.find('No such file') == -1:
                        command = 'sudo systemctl restart pdns'
                        ProcessUtilities.executioner(command)

            ## Add Record to CF if SYNC Enabled

            try:

                dns = DNS()
                dns.admin = zone.admin
                dns.loadCFKeys()

                cf = CloudFlare.CloudFlare(email=dns.email, token=dns.key)

                if dns.status == 'Enable':
                    try:
                        params = {'name': zone.name, 'per_page': 50}
                        zones = cf.zones.get(params=params)

                        for zone in sorted(zones, key=lambda v: v['name']):
                            zone = zone['id']

                            DNS.createDNSRecordCloudFlare(cf, zone, name, type, value, ttl, priority)

                    except CloudFlare.exceptions.CloudFlareAPIError as e:
                        logging.CyberCPLogFileWriter.writeToFile(str(e))
                    except Exception as e:
                        logging.CyberCPLogFileWriter.writeToFile(str(e))
            except:
                pass

        except BaseException as msg:
            logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [createDNSRecord]")

    @staticmethod
    def deleteDNSZone(virtualHostName):
        try:
            delZone = Domains.objects.get(name=virtualHostName)
            delZone.delete()
        except:
            ## There does not exist a zone for this domain.
            pass

    @staticmethod
    def createDNSZone(virtualHostName, admin):
        try:
            zone = Domains(admin=admin, name=virtualHostName, type="NATIVE")
            zone.save()
        except:
            ## There does not exist a zone for this domain.
            pass

    @staticmethod
    def getDNSRecords(virtualHostName):
        try:
            zone = Domains.objects.get(name=virtualHostName)
            zone.save()
            return zone.records_set.all()
        except:
            ## There does not exist a zone for this domain.
            pass

    @staticmethod
    def getDNSZones():
        try:
            return Domains.objects.all()
        except:
            pass

    @staticmethod
    def deleteDNSRecord(recordID):
        try:
            delRecord = Records.objects.get(id=recordID)
            delRecord.delete()
        except:
            ## There does not exist a zone for this domain.
            pass

    @staticmethod
    def ConfigurePowerDNSInAcme():
        try:
            from plogical.randomPassword import generate_pass
            path = '/root/.acme.sh/account.conf'

            APIKey = generate_pass(16)

            CurrentContent = ProcessUtilities.outputExecutioner(f'cat {path}')

            if CurrentContent.find('PDNS_Url') == -1:
                PDNSContent = f"""
PDNS_Url='http://localhost:8081'
PDNS_ServerId='localhost'
PDNS_Token='{APIKey}'
"""

                command = f'echo "{PDNSContent}" >> {path}'
                ProcessUtilities.executioner(command,None, True)

                if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8:
                    PDNSPath = '/etc/pdns/pdns.conf'
                else:
                    PDNSPath = '/etc/powerdns/pdns.conf'


                PDNSConf = f"""
# Turn on the webserver API
webserver=yes
webserver-address=0.0.0.0
webserver-port=8081

# Set the API key for accessing the API
api=yes
api-key={APIKey}

webserver-allow-from=0.0.0.0/0
"""
                command = f'echo "{PDNSConf}" >> {PDNSPath}'
                ProcessUtilities.executioner(command,None, True)

                command = 'systemctl restart pdns'
                ProcessUtilities.executioner(command)


            return 1, None

        except BaseException as msg:
            logging.CyberCPLogFileWriter.writeToFile(f'ConfigurePowerDNSInAcme, Error: {str(msg)}')
            return 0, str(msg)

    @staticmethod
    def ConfigureCloudflareInAcme(SAVED_CF_Key, SAVED_CF_Email):
        try:

            ## remove existing keys first

            path = '/root/.acme.sh/account.conf'

            command = f"sed -i '/SAVED_CF_Key/d;/SAVED_CF_Email/d' {path}"
            ProcessUtilities.executioner(command)


            CFContent = f"""
SAVED_CF_Key='{SAVED_CF_Key}'
SAVED_CF_Email='{SAVED_CF_Email}'
"""

            command = f'echo "{CFContent}" >> {path}'
            ProcessUtilities.executioner(command, None, True)

            return 1, None

        except BaseException as msg:
            logging.CyberCPLogFileWriter.writeToFile(f'ConfigureCloudflareInAcme, Error: {str(msg)}')
            return 0, str(msg)