mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-10-30 01:36:30 +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)
 |