add support for TXT records!
This commit change the way to edit a record. This add a unique identifier to all records (a hash of the name, data, ttl, class and type). All the records are now stored on the session (this avoid a too long GET).
This commit is contained in:
parent
a158e984de
commit
ac262bd17c
|
@ -56,7 +56,7 @@ class FormAddForwardRecord(forms.Form):
|
||||||
required=False)
|
required=False)
|
||||||
record_type = forms.ChoiceField(choices=settings.RECORD_TYPE_CHOICES)
|
record_type = forms.ChoiceField(choices=settings.RECORD_TYPE_CHOICES)
|
||||||
zone_name = forms.CharField(max_length=100)
|
zone_name = forms.CharField(max_length=100)
|
||||||
record_data = forms.CharField(max_length=100)
|
record_data = forms.CharField(max_length=1000, widget=forms.Textarea)
|
||||||
ttl = forms.ChoiceField(choices=settings.TTL_CHOICES)
|
ttl = forms.ChoiceField(choices=settings.TTL_CHOICES)
|
||||||
create_reverse = forms.BooleanField(required=False)
|
create_reverse = forms.BooleanField(required=False)
|
||||||
key_name = forms.ModelChoiceField(queryset=Key.objects.all(), required=True)
|
key_name = forms.ModelChoiceField(queryset=Key.objects.all(), required=True)
|
||||||
|
|
|
@ -148,6 +148,8 @@ def create_update(dns_server, zone_name, record_name, record_type, record_data,
|
||||||
dns_update = dns.update.Update(zone_name,
|
dns_update = dns.update.Update(zone_name,
|
||||||
keyring=keyring,
|
keyring=keyring,
|
||||||
keyalgorithm=algorithm)
|
keyalgorithm=algorithm)
|
||||||
|
if record_type == "TXT":
|
||||||
|
record_data = '"{}"'.format(record_data)
|
||||||
dns_update.replace(record_name, ttl, record_type, record_data)
|
dns_update.replace(record_name, ttl, record_type, record_data)
|
||||||
output = send_dns_update(dns_update, dns_server, server.dns_port, key_name)
|
output = send_dns_update(dns_update, dns_server, server.dns_port, key_name)
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
# Standard Imports
|
# Standard Imports
|
||||||
import base64
|
import base64
|
||||||
import binascii
|
import binascii
|
||||||
|
import hashlib
|
||||||
|
import shlex
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
# 3rd Party
|
# 3rd Party
|
||||||
|
@ -221,14 +223,20 @@ class BindServer(models.Model):
|
||||||
for current_name in names:
|
for current_name in names:
|
||||||
current_record = zone[current_name].to_text(current_name)
|
current_record = zone[current_name].to_text(current_name)
|
||||||
for split_record in current_record.split("\n"):
|
for split_record in current_record.split("\n"):
|
||||||
current_record = split_record.split(" ")
|
current_record = shlex.split(split_record)
|
||||||
rr_dict = {}
|
rr_dict = {}
|
||||||
rr_dict["rr_name"] = current_record[0]
|
rr_dict["rr_name"] = current_record[0]
|
||||||
rr_dict["rr_ttl"] = current_record[1]
|
rr_dict["rr_ttl"] = current_record[1]
|
||||||
rr_dict["rr_class"] = current_record[2]
|
rr_dict["rr_class"] = current_record[2]
|
||||||
rr_dict["rr_type"] = current_record[3]
|
rr_dict["rr_type"] = current_record[3]
|
||||||
rr_dict["rr_data"] = current_record[4]
|
rr_dict["rr_data"] = current_record[4]
|
||||||
|
rr_dict["rr_uid"] = hashlib.sha1("{}{}{}{}{}".format(
|
||||||
|
rr_dict["rr_name"],
|
||||||
|
rr_dict["rr_ttl"],
|
||||||
|
rr_dict["rr_class"],
|
||||||
|
rr_dict["rr_type"],
|
||||||
|
rr_dict["rr_data"],
|
||||||
|
).encode()).hexdigest()
|
||||||
record_array.append(rr_dict)
|
record_array.append(rr_dict)
|
||||||
|
|
||||||
return record_array
|
return record_array
|
||||||
|
|
|
@ -162,7 +162,10 @@ TTL_CHOICES = ((300, "5 minutes"),
|
||||||
|
|
||||||
RECORD_TYPE_CHOICES = (("A", "A"),
|
RECORD_TYPE_CHOICES = (("A", "A"),
|
||||||
("AAAA", "AAAA"),
|
("AAAA", "AAAA"),
|
||||||
("CNAME", "CNAME"))
|
("CNAME", "CNAME"),
|
||||||
|
("TXT", "TXT"))
|
||||||
|
|
||||||
|
SESSION_SAVE_EVERY_REQUEST = True
|
||||||
|
|
||||||
LOGIN_REDIRECT_URL = '/'
|
LOGIN_REDIRECT_URL = '/'
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ record in {{ form.zone_name.value }}
|
||||||
<div class="form-group{% if form.record_data.errors %} has-error{% endif %}">
|
<div class="form-group{% if form.record_data.errors %} has-error{% endif %}">
|
||||||
<label for="record_data" class="col-sm-3 control-label">Record Data:</label>
|
<label for="record_data" class="col-sm-3 control-label">Record Data:</label>
|
||||||
<div class="col-sm-5 col-md-4">
|
<div class="col-sm-5 col-md-4">
|
||||||
<input id="record_data" name="record_data" type="text" class="form-control"{% if form.record_data.value %} value="{{ form.record_data.value }}"{% endif %} />
|
<textarea id="record_data" name="record_data" rows = "5" type="text" class="form-control">{% if form.record_data.value %}{{ form.record_data.value }}{% endif %}</textarea>
|
||||||
</div>
|
</div>
|
||||||
{% if form.record_data.errors %}
|
{% if form.record_data.errors %}
|
||||||
<div class="col-sm-4 col-md-5">
|
<div class="col-sm-4 col-md-5">
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
Record Actions <span class="caret"></span>
|
Record Actions <span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a href="{% url "edit_record" dns_server=dns_server.hostname zone_name=zone_name record_name=current_record.rr_name record_data=current_record.rr_data record_ttl=current_record.rr_ttl%}">Edit Record</a></li>
|
<li><a href="{% url "edit_record" dns_server=dns_server.hostname zone_name=zone_name uid=current_record.rr_uid %}">Edit Record</a></li>
|
||||||
{% if current_record.rr_type == "A" %}
|
{% if current_record.rr_type == "A" %}
|
||||||
<li><a href="{% url "add_cname" dns_server=dns_server.hostname zone_name=zone_name record_name=current_record.rr_name %}">Add CNAME Pointer</a></li>
|
<li><a href="{% url "add_cname" dns_server=dns_server.hostname zone_name=zone_name record_name=current_record.rr_name %}">Add CNAME Pointer</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -21,5 +21,5 @@ urlpatterns = [
|
||||||
url(r'^add_record/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/$', binder.views.view_add_record, name="add_record"),
|
url(r'^add_record/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/$', binder.views.view_add_record, name="add_record"),
|
||||||
url(r'^add_cname/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/(?P<record_name>.*?)/$', binder.views.view_add_cname_record, name="add_cname"),
|
url(r'^add_cname/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/(?P<record_name>.*?)/$', binder.views.view_add_cname_record, name="add_cname"),
|
||||||
url(r'^delete_record/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/$', binder.views.view_delete_record, name="delete_record"),
|
url(r'^delete_record/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/$', binder.views.view_delete_record, name="delete_record"),
|
||||||
url(r'^edit_record/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/(?P<record_name>[\S+]+)/(?P<record_data>[\S+]+)/(?P<record_ttl>[\S+]+)/$', binder.views.view_edit_record, name="edit_record"),
|
url(r'^edit_record/(?P<dns_server>[a-zA-Z0-9.-]+)/(?P<zone_name>[a-zA-Z0-9.-]+)/(?P<uid>[a-f0-9]+)/$', binder.views.view_edit_record, name="edit_record"),
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# Binder Views
|
# Binder Views
|
||||||
|
|
||||||
|
import copy
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
# 3rd Party
|
# 3rd Party
|
||||||
|
@ -72,6 +73,13 @@ def view_zone_records(request, dns_server, zone_name):
|
||||||
return render(request, "bcommon/list_zone.html",
|
return render(request, "bcommon/list_zone.html",
|
||||||
{"zone_name": zone_name,
|
{"zone_name": zone_name,
|
||||||
"dns_server": this_server})
|
"dns_server": this_server})
|
||||||
|
if dns_server not in request.session:
|
||||||
|
request.session[dns_server] = {}
|
||||||
|
if zone_name not in request.session[dns_server]:
|
||||||
|
request.session[dns_server][zone_name] = {}
|
||||||
|
for record in zone_array:
|
||||||
|
request.session[dns_server][zone_name][record['rr_uid']] = copy.copy(record)
|
||||||
|
request.session.modified = True
|
||||||
|
|
||||||
return render(request, "bcommon/list_zone.html",
|
return render(request, "bcommon/list_zone.html",
|
||||||
{"zone_array": zone_array,
|
{"zone_array": zone_array,
|
||||||
|
@ -126,8 +134,7 @@ def view_add_record(request, dns_server, zone_name):
|
||||||
{"dns_server": this_server,
|
{"dns_server": this_server,
|
||||||
"form": form})
|
"form": form})
|
||||||
|
|
||||||
def view_edit_record(request, dns_server, zone_name, record_name=None,
|
def view_edit_record(request, dns_server, zone_name, uid):
|
||||||
record_type=None, record_data=None, record_ttl=None):
|
|
||||||
"""View to edit an RR record to DNS zone."""
|
"""View to edit an RR record to DNS zone."""
|
||||||
this_server = get_object_or_404(models.BindServer, hostname=dns_server)
|
this_server = get_object_or_404(models.BindServer, hostname=dns_server)
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
|
@ -161,11 +168,22 @@ def view_edit_record(request, dns_server, zone_name, record_name=None,
|
||||||
else:
|
else:
|
||||||
key_id = models.BindServer.objects.get(
|
key_id = models.BindServer.objects.get(
|
||||||
hostname=dns_server).default_transfer_key.id
|
hostname=dns_server).default_transfer_key.id
|
||||||
|
record = None
|
||||||
|
if (dns_server in request.session and
|
||||||
|
zone_name in request.session[dns_server] and
|
||||||
|
uid in request.session[dns_server][zone_name]):
|
||||||
|
record = request.session[dns_server][zone_name][uid]
|
||||||
|
else:
|
||||||
|
messages.error(request, 'Record not found: please return to your zone records')
|
||||||
|
form = forms.FormAddForwardRecord(initial={'zone_name': zone_name, 'key_name': key_id})
|
||||||
|
return render(request, "bcommon/add_record_form.html",
|
||||||
|
{"dns_server": this_server,
|
||||||
|
"form": form})
|
||||||
form = forms.FormAddForwardRecord(initial={'zone_name': zone_name,
|
form = forms.FormAddForwardRecord(initial={'zone_name': zone_name,
|
||||||
'record_name': record_name,
|
'record_name': record['rr_name'],
|
||||||
'record_data': record_data,
|
'record_data': record['rr_data'],
|
||||||
'ttl': record_ttl,
|
'ttl': record['rr_ttl'],
|
||||||
'record_type': record_type,
|
'record_type': record['rr_type'],
|
||||||
'key_name': key_id
|
'key_name': key_id
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue