2012-11-19 02:10:09 +00:00
|
|
|
from binder import keyutils, exceptions
|
|
|
|
# TODO: Start using exceptions here, force a record/add/delete on
|
|
|
|
# an unresponsive Bind server.
|
2011-04-23 15:19:01 +00:00
|
|
|
|
2011-11-24 16:57:13 +00:00
|
|
|
import re
|
2011-04-25 00:52:56 +00:00
|
|
|
import dns.query
|
2011-11-24 16:57:13 +00:00
|
|
|
import dns.reversename
|
|
|
|
import dns.update
|
2011-04-25 00:52:56 +00:00
|
|
|
|
2012-11-18 04:01:37 +00:00
|
|
|
from binder import exceptions, models
|
2012-10-27 22:03:45 +00:00
|
|
|
|
2011-11-25 12:58:43 +00:00
|
|
|
re_IPADDRESS = re.compile(r"\d+.\d+.\d+.\d+")
|
|
|
|
|
2012-10-27 22:03:45 +00:00
|
|
|
def add_forward_record(dns_server, zone_name, record_name, record_type, record_data, ttl, keyring):
|
2012-11-22 03:08:37 +00:00
|
|
|
""" Create a forward DNS record given passed arguments.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
String dns_server
|
|
|
|
String zone_name
|
|
|
|
String record_name (just record name, not FQDN)
|
|
|
|
String record_type (A, AAAA, etc)
|
|
|
|
String record_data (IP address)
|
|
|
|
Int ttl
|
|
|
|
Dict keyring object
|
|
|
|
|
|
|
|
Return:
|
|
|
|
String representation of DNS update output from record creation.
|
|
|
|
"""
|
2011-11-24 16:57:13 +00:00
|
|
|
|
2012-10-27 22:03:45 +00:00
|
|
|
dns_update = dns.update.Update(zone_name, keyring = keyring)
|
|
|
|
dns_update.replace(record_name, ttl, record_type, record_data)
|
2012-11-19 02:10:09 +00:00
|
|
|
output = dns.query.tcp(dns_update, dns_server)
|
2011-11-24 16:57:13 +00:00
|
|
|
|
2012-11-19 02:10:09 +00:00
|
|
|
return output
|
2011-11-24 16:57:13 +00:00
|
|
|
|
2012-10-27 22:03:45 +00:00
|
|
|
def add_reverse_record(dns_server, zone_name, record_name, record_data, ttl, keyring):
|
2012-11-22 03:08:37 +00:00
|
|
|
""" Create a reverse DNS record (PTR) given passed arguments.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
String dns_server
|
|
|
|
String zone_name
|
|
|
|
String record_name (just record name, not FQDN)
|
|
|
|
String record_type (A, AAAA, etc)
|
|
|
|
String record_data (IP address)
|
|
|
|
Int ttl
|
|
|
|
Dict keyring object
|
|
|
|
|
|
|
|
Return:
|
|
|
|
String representation of DNS update output from record creation.
|
|
|
|
"""
|
|
|
|
|
2012-10-27 22:03:45 +00:00
|
|
|
reverse_ip_fqdn = str(dns.reversename.from_address(record_data))
|
2011-11-24 16:57:13 +00:00
|
|
|
reverse_ip = re.search(r"([0-9]+).(.*).$", reverse_ip_fqdn).group(1)
|
|
|
|
reverse_domain = re.search(r"([0-9]+).(.*).$", reverse_ip_fqdn).group(2)
|
|
|
|
|
2012-10-27 22:03:45 +00:00
|
|
|
dns_update = dns.update.Update(reverse_domain, keyring = keyring)
|
|
|
|
dns_update.replace(reverse_ip, ttl, "PTR", "%s.%s." % (record_name, zone_name))
|
|
|
|
output = dns.query.tcp(dns_update, dns_server)
|
2011-11-24 16:57:13 +00:00
|
|
|
|
2011-11-25 12:58:43 +00:00
|
|
|
return output
|
2011-11-24 16:57:13 +00:00
|
|
|
|
2012-11-22 03:08:37 +00:00
|
|
|
def add_record(dns_server, zone_name, record_name, record_type, record_data, ttl, key_name, create_reverse):
|
|
|
|
""" Create DNS record(s) given passed arguments.
|
2011-11-24 16:57:13 +00:00
|
|
|
|
2012-11-22 03:08:37 +00:00
|
|
|
Args:
|
|
|
|
String dns_server
|
|
|
|
String zone_name
|
|
|
|
String record_name (just record name, not FQDN)
|
|
|
|
String record_type (A, AAAA, etc)
|
|
|
|
String record_data (IP address)
|
|
|
|
Int ttl
|
|
|
|
String key_name (from Key model)
|
|
|
|
Boolean create_reverse
|
|
|
|
|
|
|
|
Return:
|
|
|
|
Dict containing {description, output} from record creation
|
|
|
|
"""
|
|
|
|
|
|
|
|
if key_name is None:
|
2012-10-13 21:00:22 +00:00
|
|
|
keyring = None
|
2012-11-22 03:08:37 +00:00
|
|
|
else:
|
|
|
|
this_key = models.Key.objects.get(name=key_name)
|
|
|
|
keyring = keyutils.create_keyring(this_key.name, this_key.data)
|
2011-11-25 22:43:26 +00:00
|
|
|
|
2012-10-27 22:03:45 +00:00
|
|
|
response = []
|
2012-11-22 03:08:37 +00:00
|
|
|
response.append({ "description" : "Forward Record Added: %s.%s" % (record_name, zone_name),
|
|
|
|
"output" : add_forward_record(dns_server,
|
|
|
|
zone_name,
|
|
|
|
record_name,
|
|
|
|
record_type,
|
|
|
|
record_data,
|
|
|
|
ttl,
|
2012-10-27 22:03:45 +00:00
|
|
|
keyring)})
|
2011-11-24 16:57:13 +00:00
|
|
|
|
2012-11-22 03:08:37 +00:00
|
|
|
if create_reverse:
|
|
|
|
response.append({ "description" : "Reverse Record Added: %s" % record_data,
|
|
|
|
"output" : add_reverse_record(dns_server,
|
|
|
|
zone_name,
|
|
|
|
record_name,
|
|
|
|
record_data,
|
|
|
|
ttl,
|
2012-10-27 22:03:45 +00:00
|
|
|
keyring)})
|
|
|
|
|
|
|
|
return response
|
|
|
|
|
|
|
|
def add_cname_record(dns_server, zone_name, originating_record, cname, ttl, key_name):
|
|
|
|
"""Add a Cname record."""
|
|
|
|
|
2012-11-19 02:10:09 +00:00
|
|
|
if key_name == "None":
|
2012-10-27 22:03:45 +00:00
|
|
|
keyring = None
|
2012-11-18 04:01:37 +00:00
|
|
|
else:
|
2012-11-19 02:10:09 +00:00
|
|
|
this_key = models.Key.objects.get(name=key_name)
|
2012-11-18 04:01:37 +00:00
|
|
|
keyring = keyutils.create_keyring(this_key.name, this_key.data)
|
2012-10-27 22:03:45 +00:00
|
|
|
|
|
|
|
update = dns.update.Update(zone_name, keyring = keyring)
|
2012-11-22 01:39:08 +00:00
|
|
|
update.replace(cname, ttl, 'CNAME', originating_record + ".")
|
2012-10-27 22:03:45 +00:00
|
|
|
response = dns.query.tcp(update, dns_server)
|
2011-04-25 01:10:25 +00:00
|
|
|
|
2012-10-29 00:32:37 +00:00
|
|
|
return [{ "description" : "CNAME %s.%s points to %s" % (cname, zone_name, originating_record),
|
|
|
|
"output" : response}]
|
|
|
|
|
2011-11-25 12:58:43 +00:00
|
|
|
|
|
|
|
def delete_record(form_data, rr_items):
|
2012-10-18 10:34:22 +00:00
|
|
|
"""Delete a list of DNS records passed as strings in rr_items."""
|
2012-10-27 22:03:45 +00:00
|
|
|
|
|
|
|
if form_data["key_name"]:
|
2012-11-18 04:01:37 +00:00
|
|
|
this_key = models.Key.objects.get(name=form_data["key_name"])
|
|
|
|
keyring = keyutils.create_keyring(this_key.name, this_key.data)
|
2012-10-18 10:34:22 +00:00
|
|
|
else:
|
|
|
|
keyring = None
|
2011-11-26 18:03:00 +00:00
|
|
|
|
|
|
|
dns_server = form_data["dns_server"]
|
2011-11-25 12:58:43 +00:00
|
|
|
delete_response = []
|
|
|
|
for current_rr_item in rr_items:
|
|
|
|
re_record = re.search(r"(\w+)\.(.*)$", current_rr_item)
|
|
|
|
record = re_record.group(1)
|
|
|
|
domain = re_record.group(2)
|
|
|
|
dns_update = dns.update.Update(domain, keyring = keyring)
|
|
|
|
dns_update.delete(record)
|
|
|
|
output = dns.query.tcp(dns_update, dns_server)
|
2012-11-19 02:10:09 +00:00
|
|
|
delete_response.append({ "description" : "Delete record %s" % current_rr_item,
|
|
|
|
"output" : output })
|
2011-11-25 12:58:43 +00:00
|
|
|
|
|
|
|
return delete_response
|