mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-11-03 20:05:58 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			953 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			953 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/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)
 |