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:
Jérôme Schneider 2019-04-16 17:56:53 +02:00
parent a158e984de
commit ac262bd17c
8 changed files with 44 additions and 13 deletions

View File

@ -56,7 +56,7 @@ class FormAddForwardRecord(forms.Form):
required=False)
record_type = forms.ChoiceField(choices=settings.RECORD_TYPE_CHOICES)
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)
create_reverse = forms.BooleanField(required=False)
key_name = forms.ModelChoiceField(queryset=Key.objects.all(), required=True)

View File

@ -148,6 +148,8 @@ def create_update(dns_server, zone_name, record_name, record_type, record_data,
dns_update = dns.update.Update(zone_name,
keyring=keyring,
keyalgorithm=algorithm)
if record_type == "TXT":
record_data = '"{}"'.format(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)

View File

@ -3,6 +3,8 @@
# Standard Imports
import base64
import binascii
import hashlib
import shlex
import socket
# 3rd Party
@ -221,14 +223,20 @@ class BindServer(models.Model):
for current_name in names:
current_record = zone[current_name].to_text(current_name)
for split_record in current_record.split("\n"):
current_record = split_record.split(" ")
current_record = shlex.split(split_record)
rr_dict = {}
rr_dict["rr_name"] = current_record[0]
rr_dict["rr_ttl"] = current_record[1]
rr_dict["rr_class"] = current_record[2]
rr_dict["rr_type"] = current_record[3]
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)
return record_array

View File

@ -162,7 +162,10 @@ TTL_CHOICES = ((300, "5 minutes"),
RECORD_TYPE_CHOICES = (("A", "A"),
("AAAA", "AAAA"),
("CNAME", "CNAME"))
("CNAME", "CNAME"),
("TXT", "TXT"))
SESSION_SAVE_EVERY_REQUEST = True
LOGIN_REDIRECT_URL = '/'

View File

@ -75,7 +75,7 @@ record in {{ form.zone_name.value }}
<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>
<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>
{% if form.record_data.errors %}
<div class="col-sm-4 col-md-5">

View File

@ -33,7 +33,7 @@
Record Actions <span class="caret"></span>
</button>
<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" %}
<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 %}

View File

@ -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_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'^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"),
]

View File

@ -1,5 +1,6 @@
# Binder Views
import copy
import subprocess
# 3rd Party
@ -72,6 +73,13 @@ def view_zone_records(request, dns_server, zone_name):
return render(request, "bcommon/list_zone.html",
{"zone_name": zone_name,
"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",
{"zone_array": zone_array,
@ -126,8 +134,7 @@ def view_add_record(request, dns_server, zone_name):
{"dns_server": this_server,
"form": form})
def view_edit_record(request, dns_server, zone_name, record_name=None,
record_type=None, record_data=None, record_ttl=None):
def view_edit_record(request, dns_server, zone_name, uid):
"""View to edit an RR record to DNS zone."""
this_server = get_object_or_404(models.BindServer, hostname=dns_server)
if request.method == 'POST':
@ -161,11 +168,22 @@ def view_edit_record(request, dns_server, zone_name, record_name=None,
else:
key_id = models.BindServer.objects.get(
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,
'record_name': record_name,
'record_data': record_data,
'ttl': record_ttl,
'record_type': record_type,
'record_name': record['rr_name'],
'record_data': record['rr_data'],
'ttl': record['rr_ttl'],
'record_type': record['rr_type'],
'key_name': key_id
})