2018-06-30 15:29:56 +05:00
|
|
|
#!/usr/local/CyberCP/bin/python2
|
2018-06-01 02:08:21 +05:00
|
|
|
import os,sys
|
|
|
|
|
sys.path.append('/usr/local/CyberCP')
|
|
|
|
|
import django
|
|
|
|
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
|
|
|
|
|
django.setup()
|
2017-10-24 19:16:36 +05:00
|
|
|
import CyberCPLogFileWriter as logging
|
|
|
|
|
import subprocess
|
2018-06-01 02:08:21 +05:00
|
|
|
import shlex
|
|
|
|
|
from dns.models import Domains,Records
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
class DNS:
|
|
|
|
|
|
|
|
|
|
nsd_base = "/etc/nsd/nsd.conf"
|
|
|
|
|
zones_base_dir = "/usr/local/lsws/conf/zones/"
|
|
|
|
|
create_zone_dir = "/usr/local/lsws/conf/zones"
|
|
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
## DNS Functions
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
@staticmethod
|
2018-06-01 02:08:21 +05:00
|
|
|
def dnsTemplate(domain, admin):
|
2017-10-24 19:16:36 +05:00
|
|
|
try:
|
|
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
ipFile = "/etc/cyberpanel/machineIP"
|
|
|
|
|
f = open(ipFile)
|
|
|
|
|
ipData = f.read()
|
|
|
|
|
ipAddress = ipData.split('\n', 1)[0]
|
|
|
|
|
|
|
|
|
|
import tldextract
|
|
|
|
|
|
|
|
|
|
extractDomain = tldextract.extract(domain)
|
|
|
|
|
topLevelDomain = extractDomain.domain + '.' + extractDomain.suffix
|
|
|
|
|
subDomain = extractDomain.subdomain
|
|
|
|
|
|
|
|
|
|
if len(subDomain) == 0:
|
|
|
|
|
|
|
|
|
|
if Domains.objects.filter(name=topLevelDomain).count() == 0:
|
|
|
|
|
zone = Domains(admin=admin, name=topLevelDomain, type="NATIVE")
|
|
|
|
|
zone.save()
|
|
|
|
|
|
|
|
|
|
content = "ns1." + topLevelDomain + " hostmaster." + topLevelDomain + " 1 10800 3600 604800 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()
|
|
|
|
|
|
|
|
|
|
## 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()
|
|
|
|
|
|
|
|
|
|
# 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()
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
## MX Record.
|
|
|
|
|
|
|
|
|
|
mxValue = "mail." + 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()
|
|
|
|
|
|
|
|
|
|
record = Records(domainOwner=zone,
|
|
|
|
|
domain_id=zone.id,
|
|
|
|
|
name=mxValue,
|
|
|
|
|
type="A",
|
|
|
|
|
content=ipAddress,
|
|
|
|
|
ttl=3600,
|
|
|
|
|
prio=0,
|
|
|
|
|
disabled=0,
|
|
|
|
|
auth=1)
|
|
|
|
|
record.save()
|
|
|
|
|
|
|
|
|
|
## 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()
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
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()
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
else:
|
2018-06-01 02:08:21 +05:00
|
|
|
if Domains.objects.filter(name=topLevelDomain).count() == 0:
|
|
|
|
|
zone = Domains(admin=admin, name=topLevelDomain, type="NATIVE")
|
|
|
|
|
zone.save()
|
|
|
|
|
|
|
|
|
|
content = "ns1." + topLevelDomain + " hostmaster." + topLevelDomain + " 1 10800 3600 604800 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()
|
|
|
|
|
|
|
|
|
|
## 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()
|
|
|
|
|
|
|
|
|
|
# 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()
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
## MX Record.
|
|
|
|
|
|
|
|
|
|
mxValue = "mail." + 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()
|
|
|
|
|
|
|
|
|
|
record = Records(domainOwner=zone,
|
|
|
|
|
domain_id=zone.id,
|
|
|
|
|
name=mxValue,
|
|
|
|
|
type="A",
|
|
|
|
|
content=ipAddress,
|
|
|
|
|
ttl=3600,
|
|
|
|
|
prio=0,
|
|
|
|
|
disabled=0,
|
|
|
|
|
auth=1)
|
|
|
|
|
record.save()
|
|
|
|
|
|
2018-06-11 21:04:55 +05:00
|
|
|
## 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()
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
## 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)
|
|
|
|
|
|
|
|
|
|
# CNAME Records.
|
|
|
|
|
|
|
|
|
|
cNameValue = "www." + actualSubDomain
|
|
|
|
|
|
|
|
|
|
DNS.createDNSRecord(zone, cNameValue, "CNAME", actualSubDomain, 0, 3600)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(
|
|
|
|
|
"We had errors while creating DNS records for: " + domain + ". Error message: " + str(msg))
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
@staticmethod
|
2018-06-01 02:08:21 +05:00
|
|
|
def createDKIMRecords(domain):
|
2017-10-24 19:16:36 +05:00
|
|
|
try:
|
|
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
import tldextract
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
extractDomain = tldextract.extract(domain)
|
|
|
|
|
topLevelDomain = extractDomain.domain + '.' + extractDomain.suffix
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
zone = Domains.objects.get(name=topLevelDomain)
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
path = "/etc/opendkim/keys/" + topLevelDomain + "/default.txt"
|
|
|
|
|
command = "sudo cat " + path
|
|
|
|
|
output = subprocess.check_output(shlex.split(command))
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
record = Records(domainOwner=zone,
|
|
|
|
|
domain_id=zone.id,
|
|
|
|
|
name="default._domainkey." + topLevelDomain,
|
|
|
|
|
type="TXT",
|
|
|
|
|
content="v=DKIM1; k=rsa; p=" + output[53:269],
|
|
|
|
|
ttl=3600,
|
|
|
|
|
prio=0,
|
|
|
|
|
disabled=0,
|
|
|
|
|
auth=1)
|
|
|
|
|
record.save()
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-01 02:08:21 +05:00
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(
|
2018-06-11 21:04:55 +05:00
|
|
|
"We had errors while creating DKIM record for: " + domain + ". Error message: " + str(msg))
|
2017-10-24 19:16:36 +05:00
|
|
|
|
2018-06-05 00:53:45 +05:00
|
|
|
@staticmethod
|
|
|
|
|
def getZoneObject(virtualHostName):
|
|
|
|
|
try:
|
|
|
|
|
return Domains.objects.get(name=virtualHostName)
|
|
|
|
|
except:
|
|
|
|
|
return 0
|
|
|
|
|
|
2017-10-24 19:16:36 +05:00
|
|
|
@staticmethod
|
2018-06-01 02:08:21 +05:00
|
|
|
def createDNSRecord(zone, name, type, value, priority, ttl):
|
2018-06-11 21:04:55 +05:00
|
|
|
try:
|
|
|
|
|
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()
|
|
|
|
|
return
|
2018-06-05 00:53:45 +05:00
|
|
|
|
2018-06-27 00:16:50 +05:00
|
|
|
if type == 'MX':
|
|
|
|
|
record = Records(domainOwner=zone,
|
|
|
|
|
domain_id=zone.id,
|
|
|
|
|
name=name,
|
|
|
|
|
type=type,
|
|
|
|
|
content=value,
|
|
|
|
|
ttl=ttl,
|
|
|
|
|
prio=priority,
|
|
|
|
|
disabled=0,
|
|
|
|
|
auth=1)
|
|
|
|
|
record.save()
|
|
|
|
|
|
2018-06-11 21:04:55 +05:00
|
|
|
|
|
|
|
|
if Records.objects.filter(name=name, type=type).count() == 0:
|
2018-06-05 00:53:45 +05:00
|
|
|
record = Records(domainOwner=zone,
|
|
|
|
|
domain_id=zone.id,
|
|
|
|
|
name=name,
|
|
|
|
|
type=type,
|
|
|
|
|
content=value,
|
|
|
|
|
ttl=ttl,
|
|
|
|
|
prio=priority,
|
|
|
|
|
disabled=0,
|
|
|
|
|
auth=1)
|
|
|
|
|
record.save()
|
2018-06-11 21:04:55 +05:00
|
|
|
except BaseException, msg:
|
|
|
|
|
logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [createDNSRecord]")
|
2017-10-24 19:16:36 +05:00
|
|
|
|
|
|
|
|
@staticmethod
|
2018-06-01 02:08:21 +05:00
|
|
|
def deleteDNSZone(virtualHostName):
|
2017-10-24 19:16:36 +05:00
|
|
|
try:
|
2018-06-01 02:08:21 +05:00
|
|
|
delZone = Domains.objects.get(name=virtualHostName)
|
|
|
|
|
delZone.delete()
|
|
|
|
|
except:
|
|
|
|
|
## There does not exist a zone for this domain.
|
2018-06-05 00:53:45 +05:00
|
|
|
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
|